2015-12-15 56 views
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忽略了回車。

我用記事本打開了文件,我可以看到沒有回車符。當我使用textpad打開文件時,我可以看到回車。問題是什麼?

+2

我的猜測是該文件使用'\ n'(UNIX風格)換行符。如果記事本是Windows風格的'\ r \ n',它將只顯示換行符,但如果沒有任何'\ r \ n',大多數其他文本編輯器都足夠聰明,可以使用'\ n'換行符文件。我懷疑VB6在這方面可能像記事本一樣行事。我不太瞭解VB6提出的修復建議;也許預處理文件以用'\ r \ n'替換所有'\ n'? – senshin

+1

VB6文本I/O語句會將CR(舊的Mac標準)或CRLF(Microsoft標準)視爲行分界符,但不視爲裸LF(* NIX)。您可以使用FSO TextStream I/O,ADO Stream對象,Jet 4.0的Text IISAM,或者滾動您自己的讀取和拆分數據blob。 – Bob77

回答

0

我身邊這讓執行以下操作:

1)的文本複製到textpad 2)文件/另存爲,然後選擇純文本 3)導入生成的文件作爲正常

這是一個臨時修復。我將不得不自動化它。

0

問題是文件來自不同的系統。通常,在基於Windows的系統中,新行由CRLF字符定義。在UNIX環境中,新行由單個LF定義。

所以你的問題是,你的傳入文件有一堆LF s沒有任何CR s。您的手動方法可以工作,因爲該文件正在被覆蓋在Windows環境中,因此產生了CR LF組合。這是個好消息。壞消息是,就我所知,沒有簡單的方法可以解決這個問題。

你,我能想到的幾種方法:

1)如果你的文件不是太大,讀取整個文件到內存中,僅LF更換LFCR LF或分割,你會得到你的記錄;

2)如果你的文件不是太大,讀一個字符的時候,當你遇到LF,檢查前一個字符是不是CR並在LF前面加CR(該方法是用大文件慢,如果方法1和3不可行,則更容易實現)

3)如果您的文件固定長度大,請閱讀固定的文本塊。你甚至不需要關心新的行

4)如果文件是可變長度和大而方法2需要太多時間,請改爲讀取固定長度的文本。你將不得不寫一個稍微複雜的函數來分割和連接這些數據塊,因爲它們可能包含0到幾個實際記錄