Csv 即使记事本也会忽略回车

Csv 即使记事本也会忽略回车,csv,vb6,notepad,Csv,Vb6,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 =

有一个功能每天作为计划任务运行,从文本文件导入文本:

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
计划任务报告今天早上文本文件中有一行(通常大约有50000行)。我已经仔细阅读了代码,VB6似乎忽略了回车


我用记事本打开了文件,可以看到没有回车。当我用textpad打开文件时,我可以看到回车。问题出在哪里?

我通过以下方法解决了这个问题:

1) 将文本复制到textpad 2) 文件/另存为,然后选择纯文本 3) 正常导入生成的文件


这是暂时的解决办法。我必须将其自动化。

问题是文件来自不同的系统。通常,在基于Windows的系统中,新行由
CR
LF
字符定义。在UNIX环境中,新行由单个
LF
定义

因此,您的问题是,传入文件有一堆
LF
s,而没有任何
CR
s。手动方法之所以有效,是因为文件在windows环境中被过度写入,从而产生
crlf
组合。这就是好消息。坏消息是,据我所知,没有简单的方法来解决这个问题

我可以想到几种方法:

1) 如果您的文件不太大,请将整个文件读入内存,并将
LF
替换为
CR-LF
或仅按
LF
拆分,这样您就可以获得记录

2) 如果文件不太大,每次读取一个字符,当遇到
LF
时,检查前一个字符是否不是
CR
,并将
CR
添加到
LF
前面(对于大文件,此方法速度较慢,最不可取,但如果方法1和3不可行,则更易于实现)

3) 如果文件长度固定且较大,请读取固定的文本块。你甚至不需要关心新线


4) 如果文件长度可变且较大,并且方法2花费的时间太长,请改为读取固定长度的文本。您必须编写一个稍微复杂一点的函数来拆分和连接这些数据块,因为它们可能包含0到多个实际记录

我猜文件使用的是
\n
(UNIX样式)换行符。记事本只有在Windows样式的情况下才会显示换行符
\r\n
,但大多数其他文本编辑器都足够聪明,可以在文件中没有任何
\r\n
的情况下使用
\n
进行换行。我怀疑VB6在这方面可能表现得像记事本。我对VB6了解不够,无法提出修复方案;可能会以某种方式预处理文件,以将所有
\n
替换为
\r\n
?VB6文本I/O语句将CR(旧Mac标准)或CRLF(Microsoft标准)视为行分隔符,而不是裸LF(*NIX)。您可以使用FSO TextStream I/O、ADO Stream对象、Jet 4.0的文本IISAM,或者自行读取和拆分数据块。
11123455|Super|Woman||14/07/1962|02/111/111|L765|01110101010