Excel 如何通过VBA识别UNIX文本文件中隐藏的回车符?
我有一个用Excel/VBA编写的应用程序,它可以读取用UNIX编写的文本文件。这些文件包含在有限元建模模拟设置中,其中20k+文本文件中的每一行都是单独的设置。我的应用程序搜索一个特定的设置,并用简单的英语将它们返回给用户。某一行可能如下所示:Excel 如何通过VBA识别UNIX文本文件中隐藏的回车符?,excel,unix,text-files,ascii,vba,Excel,Unix,Text Files,Ascii,Vba,我有一个用Excel/VBA编写的应用程序,它可以读取用UNIX编写的文本文件。这些文件包含在有限元建模模拟设置中,其中20k+文本文件中的每一行都是单独的设置。我的应用程序搜索一个特定的设置,并用简单的英语将它们返回给用户。某一行可能如下所示: model.settings.excitation.modes=50 到目前为止,这行代码用于查找“=”符号和行尾之间的文本 InStr(1, FileContents, vbLf) 其中FileContents是“=”符号后的整个文本文件 我的应
model.settings.excitation.modes=50
到目前为止,这行代码用于查找“=”符号和行尾之间的文本
InStr(1, FileContents, vbLf)
其中FileContents是“=”符号后的整个文本文件
我的应用程序上游的某个地方发生了变化,无法找到假定的回车字符“vbLf”,但在记事本++中查看时,它显然存在。我的应用程序依赖于找到这个回车,现在它不工作了
我试过使用:
Asc(Mid(AdsFileContentsX, 3, 1))
要隔离回车字符,但我会从下一行得到一个字符,所以这也不起作用
我也尝试了下面所有的方法
InStr(1, FileContents, vbLf)
InStr(1, FileContents, vbCrLf)
InStr(1, FileContents, vbCr)
InStr(1, FileContents, vbNewLine)
InStr(1, FileContents, Chr(10))
InStr(1, FileContents, Chr(13))
但是这些都没有找到回车符
关于如何识别文本文件中使用的回车字符,有什么建议吗
*编辑以包含我尝试过的所有内容您可以测试ASCII10或ASCII13:
编辑#1:
这里有一种方法可以准确地确定单元格中的内容:
Sub WhatsInThere()
Dim s As String, L As Long
Dim msg As String, i As Long
msg = ""
s = Range("A1").Text
L = Len(s)
For i = 1 To L
msg = msg & vbCrLf & i & vbTab & Mid(s, i, 1) & vbTab & AscW(Mid(s, i, 1))
Next i
MsgBox msg
End Sub
在本例中,我在单元格A1中的I后面放置了一个Alt+Enter键:
非常确定VBA中有一个bug,我有013 010 013,VBA看不到,它只看到013 010
使用replace从字符串中删除013 010,然后检查结果,然后还有另一个013,因此需要2行代码才能删除它,因为这个错误通常只需要对其中一个进行反复试验:vbCrLf、vbCr vbLf或vbNewLine。请看为什么不改用RegEx?这些都不起作用。我也试过使用CHR(10)和CHR(13),我想你需要运行一个循环并打印出每个字符的ascii值。知道“行尾”字符是什么会很有用,因此如果您可以将数据样本行中的ascii值添加到您的问题中,那么我们可能会提供更多帮助。@W5ALIVE请参阅我的编辑#1祝您好运。我快发疯了,为什么我的绳子不会断。您的解决方案帮助我确定了拆分的是哪个回车字符串。您没有提到在行中读取的方法。如果使用FilesystemObject.Readline,它将读取该行,而不会返回用于查找行的enad的记录分隔符。一旦记录在Excel中,分隔符就消失了。如果文件有Windows样式的换行符,则将有2个分隔符:CR+LF。如果是*尼克斯风格,那就只有LF了。如果它来自Mac,则只使用CR。这会影响Excel中的行。您可以使用Readline以外的其他方法来读取对流程有更多控制权的行。@charlesross您是对的。问题的作者没有说明数据是如何导入的。我只在导入后处理了操作。
Sub WhatsInThere()
Dim s As String, L As Long
Dim msg As String, i As Long
msg = ""
s = Range("A1").Text
L = Len(s)
For i = 1 To L
msg = msg & vbCrLf & i & vbTab & Mid(s, i, 1) & vbTab & AscW(Mid(s, i, 1))
Next i
MsgBox msg
End Sub