0

我正在开发一个 Access 数据库,在该数据库中导入从 xls 转换的 csv 文件 通常这可行,但最近一个文件有一些字段,其中在导入 Access 后字段内的字符会发生变化

例如:破折号变为 û
开头双引号变为 ô
结尾双引号变为 ö

根据我的阅读,它与 7 位或 8 位字符代码有关。这不是我真正理解的。

我的问题是,有什么办法可以防止这种性格变化,或者有什么比我已经尝试过的更好的方法吗?或者是否有任何我没有遇到的潜在问题在我下面的示例中似乎有效?

这是我迄今为止尝试过的似乎有效的方法

从原始 Excel 文件另存为 unicode 文本文件(对我来说是新东西)

    ActiveWorkbook.SaveAs Filename:= _ 
"D:\NewFiles\ReportList.txt", FileFormat:=xlUnicodeText _ 
    , CreateBackup:=False 

然后使用以下代码导入数据库

    DoCmd.TransferText acImportDelim, "ReportList  Import Specification", "tbl_ReportList", "D:\NewFiles\ReportList.txt", True 

这似乎将文本正确导入数据库。

其他人处理数据,然后将新报表从 Access 导出到 Excel。这会将字体更改为 MS Sans Serif 并再次更改字符,但与导入时的更改不同。导出 Excel 报告后,我将字体更改为 Arial,字符再次正确......至少到目前为止。

过去我没有遇到过这种性格变化,我的解决方案似乎有效,但我不确定是否还有其他潜在问题,或者我是否遗漏了什么。我还没有找到这个特定问题的答案。

感谢您花时间帮助解决这个问题。

4

1 回答 1

0

这是我过去用来规避字符编码问题的一种方法。

我怀疑这种方法也应该在 Excel 和 Access 之间工作——尽管 Access 并不是我真正熟悉的东西。

此子项指定文件的全名和路径,以及新文件名和路径的目的地。如果您想覆盖现有的,这些可能是相同的。

注意在一些简单的测试中,我无法让它从 Excel 中读取保存为“Unicode”的文件,但它也适用于保存为“制表符分隔 TXT”文件和 CSV/逗号分隔文件的文件。

Sub OpenAndSaveTxtUTF8()
Dim txtFileName as String
Dim newTxtFileName as String

txtFileName = "D:\NewFiles\ReportList.txt"
newTxtFileName = "D:\NewFiles\UTF8_ReportList.txt"

WriteUTF8(ReadTextFile(txtFileName), newTxtFileName)

End Sub

这个 sub 调用了我从代码注释中引用的两个函数。从其内容中WriteUTF8创建一个正确的 UTF8 文件,该文件ReadTextFile返回完整文件内容的字符串。

Function ReadTextFile(sFileName As String) As String
'http://www.vbaexpress.com/kb/getarticle.php?kb_id=699
    Dim iFile As Integer

    On Local Error Resume Next
     ' \\ Use FreeFile to supply a file number that is not already in use
    iFile = FreeFile

     ' \\ ' Open file for input.
    Open sFileName For Input As #iFile

     ' \\ Return (Read) the whole content of the file to the function
    ReadTextFile = Input$(LOF(iFile), iFile)

    Close #iFile
    On Error GoTo 0
End Function

此函数需要对 ADODB 库的引用,或者,您可以Dim objStream As Object并且代码应该仍然为您工作。

Function WriteUTF8(textString$, myFileOut$)
'Modified from http://www.vbaexpress.com/forum/showthread.php?t=42375
'David Zemens - February 12, 2013

'Requires a reference to ADODB?

     ' UTF8()  Version 1.00
     ' Open a "plain" text file and save it again in UTF-8 encoding
     ' (overwriting an existing file without asking for confirmation).
     '
     ' Based on a sample script from JTMar:
     ' http://bytes.com/groups/asp/52959-save-file-utf-8-format-asp-vbscript
     '
     ' Written by Rob van der Woude
     ' http://www.robvanderwoude.com

    Dim objStream As ADODB.Stream

     ' Valid Charset values for ADODB.Stream
    Const CdoBIG5 = "big5"
    Const CdoEUC_JP = "euc-jp"
    Const CdoEUC_KR = "euc-kr"
    Const CdoGB2312 = "gb2312"
    Const CdoISO_2022_JP = "iso-2022-jp"
    Const CdoISO_2022_KR = "iso-2022-kr"
    Const CdoISO_8859_1 = "iso-8859-1"
    Const CdoISO_8859_2 = "iso-8859-2"
    Const CdoISO_8859_3 = "iso-8859-3"
    Const CdoISO_8859_4 = "iso-8859-4"
    Const CdoISO_8859_5 = "iso-8859-5"
    Const CdoISO_8859_6 = "iso-8859-6"
    Const CdoISO_8859_7 = "iso-8859-7"
    Const CdoISO_8859_8 = "iso-8859-8"
    Const CdoISO_8859_9 = "iso-8859-9"
    Const cdoKOI8_R = "koi8-r"
    Const cdoShift_JIS = "shift-jis"
    Const CdoUS_ASCII = "us-ascii"
    Const CdoUTF_7 = "utf-7"
    Const CdoUTF_8 = "utf-8"

     ' ADODB.Stream file I/O constants
    Const adTypeBinary = 1
    Const adTypeText = 2
    Const adSaveCreateNotExist = 1
    Const adSaveCreateOverWrite = 2

    On Error Resume Next

    Set objStream = CreateObject("ADODB.Stream")
    objStream.Open
    objStream.Type = adTypeText
    objStream.Position = 0
    objStream.Charset = CdoUTF_8


'We are passing a string to write to file, so omit the following line
'    objStream.LoadFromFile myFileIn

'And instead of using LoadFromFile we are writing directly from the COPIED
' text from the unsaved/temp instance of Notepad.exe
objStream.WriteText textString, 1

    objStream.SaveToFile myFileOut, adSaveCreateOverWrite
    objStream.Close
    Set objStream = Nothing

    If Err Then
        WriteUTF8 = False
    Else
        WriteUTF8 = True
    End If

    On Error GoTo 0
End Function
于 2013-05-15T02:07:47.303 回答