即使记事本也会忽略回车 returns
Carriage returns are ignored even by Notepad
有一个函数每天作为计划任务运行,从文本文件中导入文本:
Public Function ImportPersons(ByVal strImportFile As String) As Variant
Dim intFile As Integer, strRecord As String, strFields() As String
Dim lngReadCount As Long, blnChanged As Boolean
On Error GoTo GenErr:
intFile = FreeFile
Open strImportFile For Input As #intFile
Set rs = New ADODB.Recordset
DoEvents
Do While Not EOF(intFile)
Line Input #intFile, strRecord
lngReadCount = lngReadCount + 1
If strRecord <> "" Then
If InStr(strRecord, "|") > 0 Then
strFields = Split(strRecord, "|")
Else
strFields = Split(strRecord, ",")
End If
blnChanged = False
If Trim(strFields(3)) <= " " Then ' otherwise this is a company name entry and there are no person details
rs.Open "Select * from dbPerson where Reference = '" & strFields(0) & "'", objCon.ActiveCon, adOpenStatic, adLockPessimistic
If rs.EOF Then
rs.AddNew
rs("Reference") = Trim(strFields(0))
rs("FirstNames") = Trim(strFields(1))
rs("Surname") = Trim(strFields(2))
rs("DateOfBirth") = strFields(4)
rs("Height") = strFields(6)
rs("Mobile") = Trim(strFields(7))
rs("PNCID") = Trim(strFields(5))
rs("LastUpdated") = Now
rs.Update
Else
If rs("FirstNames") <> Trim(strFields(1)) Then
rs("FirstNames") = Trim(strFields(1))
blnChanged = True
End If
If rs("Surname") <> Trim(strFields(2)) Then
rs("Surname") = Trim(strFields(2))
blnChanged = True
End If
If rs("DateOfBirth") <> strFields(4) Then
rs("DateOfBirth") = strFields(4)
blnChanged = True
End If
If rs("Height") <> strFields(6) Then
rs("Height") = strFields(6)
blnChanged = True
End If
If rs("Mobile") <> Trim(strFields(7)) Then
rs("Mobile") = Trim(strFields(7))
blnChanged = True
End If
If rs("PNCID") <> Trim(strFields(5)) Then
rs("PNCID") = Trim(strFields(5))
blnChanged = True
End If
If blnChanged Then
rs("LastUpdated") = Now
rs.Update
End If
End If
rs.Close
End If
End If
Loop
Close #intFile
ImportPersons = "Total: " & lngReadCount
Exit Function
GenErr:
WriteError Err, Error$ & " in ImportPersons.", strErrorLog
ImportPersons = Error$
Exit Function
Resume
End Function
这是一些示例数据(不是真实数据):
11123455|Super|Woman||14/07/1962|02/111/111|L765|01110101010
今天早上计划任务报告文本文件中有一行(通常有50,000 行左右)。我已逐步完成代码,VB6 似乎忽略了回车 returns.
我用记事本打开文件,发现没有回车符returns。当我使用文本键盘打开文件时,我可以看到回车 returns。有什么问题?
我通过执行以下操作解决了这个问题:
1) 将文本复制到文本板
2) File/Save 为,然后 select 纯文本
3) 正常导入生成的文件
这是一个临时修复。我必须将其自动化。
问题是文件来自不同的系统。通常,在基于 Windows 的系统中,新行由 CR
和 LF
字符定义。在 UNIX 环境中,新行由单个 LF
.
定义
所以你的问题是,你的传入文件有一堆 LF
s 而没有任何 CR
s。您的手动方法有效,因为文件在 windows 环境中被覆盖,从而产生 CR LF
组合。这是个好消息。坏消息是,据我所知,没有简单的方法来解决这个问题。
你有几种我能想到的方法:
1) 如果你的文件不是太大,将整个文件读入内存并将 LF
替换为 CR LF
或仅按 LF
SPLIT 即可获得你的记录;
2)如果你的文件不是太大,一次读取一个字符,当遇到LF
时,检查前一个字符是否不是CR
并在中添加CR
LF
前面(此方法对于大文件来说很慢,这是最不可取的,但如果方法 1 和 3 不可行,则实施起来更简单)
3) 如果你的文件是固定长度和大的,读取固定的文本块。你甚至不需要关心换行
4)如果文件变长且较大,方法2耗时过长,改为读取固定长度的文本。您将不得不编写一个稍微复杂的函数来拆分和连接这些数据块,因为它们可能包含 0 到几条实际记录
有一个函数每天作为计划任务运行,从文本文件中导入文本:
Public Function ImportPersons(ByVal strImportFile As String) As Variant
Dim intFile As Integer, strRecord As String, strFields() As String
Dim lngReadCount As Long, blnChanged As Boolean
On Error GoTo GenErr:
intFile = FreeFile
Open strImportFile For Input As #intFile
Set rs = New ADODB.Recordset
DoEvents
Do While Not EOF(intFile)
Line Input #intFile, strRecord
lngReadCount = lngReadCount + 1
If strRecord <> "" Then
If InStr(strRecord, "|") > 0 Then
strFields = Split(strRecord, "|")
Else
strFields = Split(strRecord, ",")
End If
blnChanged = False
If Trim(strFields(3)) <= " " Then ' otherwise this is a company name entry and there are no person details
rs.Open "Select * from dbPerson where Reference = '" & strFields(0) & "'", objCon.ActiveCon, adOpenStatic, adLockPessimistic
If rs.EOF Then
rs.AddNew
rs("Reference") = Trim(strFields(0))
rs("FirstNames") = Trim(strFields(1))
rs("Surname") = Trim(strFields(2))
rs("DateOfBirth") = strFields(4)
rs("Height") = strFields(6)
rs("Mobile") = Trim(strFields(7))
rs("PNCID") = Trim(strFields(5))
rs("LastUpdated") = Now
rs.Update
Else
If rs("FirstNames") <> Trim(strFields(1)) Then
rs("FirstNames") = Trim(strFields(1))
blnChanged = True
End If
If rs("Surname") <> Trim(strFields(2)) Then
rs("Surname") = Trim(strFields(2))
blnChanged = True
End If
If rs("DateOfBirth") <> strFields(4) Then
rs("DateOfBirth") = strFields(4)
blnChanged = True
End If
If rs("Height") <> strFields(6) Then
rs("Height") = strFields(6)
blnChanged = True
End If
If rs("Mobile") <> Trim(strFields(7)) Then
rs("Mobile") = Trim(strFields(7))
blnChanged = True
End If
If rs("PNCID") <> Trim(strFields(5)) Then
rs("PNCID") = Trim(strFields(5))
blnChanged = True
End If
If blnChanged Then
rs("LastUpdated") = Now
rs.Update
End If
End If
rs.Close
End If
End If
Loop
Close #intFile
ImportPersons = "Total: " & lngReadCount
Exit Function
GenErr:
WriteError Err, Error$ & " in ImportPersons.", strErrorLog
ImportPersons = Error$
Exit Function
Resume
End Function
这是一些示例数据(不是真实数据):
11123455|Super|Woman||14/07/1962|02/111/111|L765|01110101010
今天早上计划任务报告文本文件中有一行(通常有50,000 行左右)。我已逐步完成代码,VB6 似乎忽略了回车 returns.
我用记事本打开文件,发现没有回车符returns。当我使用文本键盘打开文件时,我可以看到回车 returns。有什么问题?
我通过执行以下操作解决了这个问题:
1) 将文本复制到文本板 2) File/Save 为,然后 select 纯文本 3) 正常导入生成的文件
这是一个临时修复。我必须将其自动化。
问题是文件来自不同的系统。通常,在基于 Windows 的系统中,新行由 CR
和 LF
字符定义。在 UNIX 环境中,新行由单个 LF
.
所以你的问题是,你的传入文件有一堆 LF
s 而没有任何 CR
s。您的手动方法有效,因为文件在 windows 环境中被覆盖,从而产生 CR LF
组合。这是个好消息。坏消息是,据我所知,没有简单的方法来解决这个问题。
你有几种我能想到的方法:
1) 如果你的文件不是太大,将整个文件读入内存并将 LF
替换为 CR LF
或仅按 LF
SPLIT 即可获得你的记录;
2)如果你的文件不是太大,一次读取一个字符,当遇到LF
时,检查前一个字符是否不是CR
并在中添加CR
LF
前面(此方法对于大文件来说很慢,这是最不可取的,但如果方法 1 和 3 不可行,则实施起来更简单)
3) 如果你的文件是固定长度和大的,读取固定的文本块。你甚至不需要关心换行
4)如果文件变长且较大,方法2耗时过长,改为读取固定长度的文本。您将不得不编写一个稍微复杂的函数来拆分和连接这些数据块,因为它们可能包含 0 到几条实际记录