在 MS Access/VBA 中摆脱 csv 文件中数据的双引号

问题描述

我想读取 .csv 文件的全部内容,然后删除数据周围的双引号。我不确定最有效的方法是什么,最好不要先将文件内容写入数组并使用 replace

TOG2021-0012;"Sandbank AC145";63,8;"2021-01-13 06:32";"2021-01-13 06:49"

 Sub csv_import()

Dim strsql1 As String
Dim strsql2 As String
Dim intNAP As Integer
Dim intIDMaßnahme As Integer
Dim strFieldlist As String
Dim strDateipfad As String
Dim strMsg As String
Dim db As DAO.Database
Dim rsCSV As DAO.Recordset
Dim rstemp As DAO.Recordset
Dim rsTennet As DAO.Recordset
Dim rsNeueMaßnahmen As DAO.Recordset
Dim rsNeueRegelungsstufe As DAO.Recordset
Dim rsImportRegelstufe_roh As DAO.Recordset
Dim rsImportRegelstufe As DAO.Recordset
Dim intRSCount As Integer
Dim i As Integer
strDateipfad = Dateiname
If strDateipfad = vbNullString Then Exit Sub

DoCmd.TransferText acImportDelim,"CSVImport_Tabelle","tblCSVtemp",strDateipfad,HasFieldNames:=1
Set db = CurrentDbC

'###    erstellt temporäre Tabelle  ###

If TableExists("tblrsstemp") Then DoCmd.DeleteObject acTable,"tblrsstemp"

strFieldlist = "txtMaßnahmenNR String,txtNAP String,dblRegelungsstufe Float,txtDatStart String,datDatStart Date,fkIDNAP Integer"
db.Execute "CREATE TABLE tblrsstemp (" & strFieldlist & ")"

On Error GoTo ErrHandler
Set rsCSV = db.OpenRecordset("tblCSVtemp")
Set rstemp = db.OpenRecordset("tblrsstemp")

'###    zählt die Datensätze der Abfrage Location    ###
    If Not rsCSV.EOF Then
        rsCSV.MoveLast
        intRSCount = rsCSV.RecordCount
        rsCSV.MoveFirst
    Else
        intRSCount = 0
    End If
    
'###    writes the CSV in a temporary tabel   ###
do while Not rsCSV.EOF
    With rstemp
         
 --->       '##### here first get rid of double quotes for the entire file ######
        If Left(rsCSV![Einspeiser/Netzbetreiber],6) = "xyz" Then
        Debug.Print "ja"
        .AddNew
        !txtMaßnahmenNr = rsCSV![Massnahmen-Nr]
        !txtNAP = rsCSV![Einspeiser/Netzbetreiber]
        !dblRegelungsstufe = rsCSV!Feld3
        !txtDatStart = rsCSV!Start
        !datDatStart = CDate(rsCSV!Start)
            If Right(rsCSV![Einspeiser/Netzbetreiber],1) = "6" Then
                    !fkIDNAP = 1
            Else
                    !fkIDNAP = 2
            End If
        .Update
        End If
    End With
    rsCSV.MoveNext
Loop

解决方法

一种选择可能是将整个文件打开到内存中,进行查找和替换,然后另存为新文件以供进一步处理。类似的东西:

Sub sReplaceInFile(strInFile As String,strOutFile As String,strOldChar As String,strNewChar As String)
    On Error GoTo E_Handle
    Dim intInFile As Integer
    Dim intOutFile As Integer
    Dim strInput As String
    intInFile = FreeFile
    Open strInFile For Input As intInFile
    strInput = Input(LOF(intInFile),intInFile)
    strInput = Replace(strInput,strOldChar,strNewChar)
    intOutFile = FreeFile
    Open strOutFile For Output As intOutFile
    Print #intOutFile,strInput
sExit:
    On Error Resume Next
    Close #intInFile
    Close #intOutFile
    Exit Sub
E_Handle:
    MsgBox Err.Description & vbCrLf & vbCrLf & "sReplaceInFile",vbOKOnly + vbCritical,"Error: " & Err.Number
    Resume sExit
End Sub

然后你可以像这样调用这个过程:

call sReplaceInFile("C:\test\quote.txt","C:\test\no-quote.csv",chr(34),"")

问候,