VBA从UCS-2 Little Endian编码文本文件中读取

时间:2014-07-24 22:57:19

标签: excel vba excel-vba

我有一大堆从Photoshop导出的文本文件,我需要导入到Excel文档中。我写了一个宏来完成工作,它似乎对我的测试文档工作得很好但是当我尝试加载Photoshop Excel生成的一些实际文件时,开始将所有数据放在除第一行之外的单独列中。

我的代码读取文本文件:

Open currentDocPath For Input As stream
    Do Until EOF(stream)
        Input #stream, currentLine
        columnContents = Split(currentLine, vbTab)
        For n = 0 To UBound(columnContents)
            ActiveSheet.Cells(row, Chr(64 + colum + n)).Value = columnContents(n)
        Next n
        row = row + 1
    Loop
Close stream

我正在阅读的文本文件看起来像这样,只有更多的数据:

"Name"  "Data"  "Info"  "blah"
"Name1" "Data1" "Info1" "blah1"
"Name2" "Data2" "Info2" "blah2"

这个问题似乎很微不足道,但是当我把它加载到excel中时,看起来就像它上面那样看起来像这样:

ÿþ"Name"    "Data"  "Info"  "blah"
Name1   
Data1   
Info1   
blah1
Name2   
Data2   
Info2   
blah2

现在我不确定为什么会这样。看起来第一行中的前两个字符就在那里,因为这些字节声明了文本编码。不知何故,这些字符保持第一行格式正确,而其余行丢失引号,所有字符都移动到新行。

了解UCS-2 Little Endian文本编码的人是否可以解释我如何解决这个问题?当我将文件转换为ASCII时,它可以正常工作。

干杯!

编辑:好的,我现在明白编码是UTF-16(我不太了解字符编码)。我的主要问题是它的格式奇怪,我不明白为什么或如何解决它。谢谢!

2 个答案:

答案 0 :(得分:1)

正如我在评论中提到的,您尝试导入的文件似乎以UTF-16编码。

this vbaexpress.com article中,有人建议以下内容应该有效:

Dim GetOpenFile As String
Dim MyData As String
Dim r As Long
GetOpenFile = Application.GetOpenFilename
r = 1
Open GetOpenFile For Input As #1
Do While Not EOF(1)
  Line Input #1, MyData
  Cells(r, 1).Value = MyData
  r = r + 1
Loop
Close #1

显然我不能自己测试,但也许它会帮助你。

答案 1 :(得分:0)

为什么不告诉excel导入文件。 MS可能已经将数十万个小时放入该代码中。记录输入以获得简单的代码。

记住Excel是非程序员编程的工具。使用它而不是试图替换它。

这些是您用于新代码的替换文件函数。添加对Microsoft Scripting Runtime的引用。

打开指定的文件并返回一个TextStream对象,该对象可用于读取,写入或附加到文件。

object.OpenTextFile(filename[, iomode[, create[, format]]])

参数 宾语 需要。 Object始终是FileSystemObject的名称。

文件名 需要。用于标识要打开的文件的字符串表达式。

IOMODE 可选的。可以是三个常量之一:ForReading,ForWriting或ForAppending。

创建 可选的。布尔值,指示如果指定的文件名不存在,是否可以创建新文件。如果创建新文件,则值为True;如果未创建,则为False。如果省略,则不会创建新文件。

<强>格式 可选的。三个三态值之一用于指示打开文件的格式。如果省略,则文件以ASCII格式打开。

format参数可以具有以下任何设置:

Constant  Value  Description  
TristateUseDefault
 -2
 Opens the file using the system default.

TristateTrue
 -1
 Opens the file as Unicode.

TristateFalse
  0
 Opens the file as ASCII.