微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在 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),"")

问候,

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。