加载带换行符的 CSV

问题描述 投票:0回答:3

我正在使用 VBA 将[此 CSV][1] 加载到 Excel。 我正在使用 [CSV Lint][2] 验证 CSV,但出现三个换行错误。

我的代码是:

 Dim ws As Worksheet 
    Set ws = ActiveSheet
    
        Dim fileName As String, folder As String    
        folder = ThisWorkbook.Path & "\"
        fileName = Dir(ThisWorkbook.Path & "\*.csv")
    
        ActiveCell.Offset(1, 0).Range("A6").Select
    
    With ActiveSheet.QueryTables _
            .Add(Connection:="TEXT;" & folder & fileName , Destination:=ActiveCell)
            .FieldNames = True
            .RowNumbers = False
            .FillAdjacentFormulas = False
            .PreserveFormatting = True
            .RefreshOnFileOpen = False
            .RefreshStyle = xlInsertDeleteCells
            .SavePassword = False
            .SaveData = True
            .AdjustColumnWidth = True
            .RefreshPeriod = 0
            .TextFilePromptOnRefresh = False
            .TextFilePlatform = 850
            .TextFileStartRow = 1
            .TextFileParseType = xlDelimited
            .TextFileTextQualifier = xlTextQualifierDoubleQuote
            .TextFileConsecutiveDelimiter = False
            .TextFileTabDelimiter = False
            .TextFileSemicolonDelimiter = False
            .TextFileCommaDelimiter = True
            .TextFileSpaceDelimiter = False
            .TextFileColumnDataTypes = Array(1, 1, 1, 1)
            .TextFileTrailingMinusNumbers = True
            .Refresh BackgroundQuery:=True
            
        End With

是否可以在不将 CSV 文件修改为新文件的情况下删除换行符? 我尝试了很多宏,但似乎没有任何效果。

如果我必须将 CSV 修改为新的,我有以下代码:

Dim fso As Object, tsIn, tsOut
Dim s As String
Dim filePath As String
Dim newCSV As String
      
filePath = folder & fileName
newCSV = folder & "report.csv"

Set fso = CreateObject("Scripting.Filesystemobject")
Set tsIn = fso.OpenTextFile(filePath, 1)
Set tsOut = fso.CreateTextFile(newCSV, 1)



Do While tsIn.AtEndOfLine <> True
    s = tsIn.readline
    s = Replace(s, vbCrLf, "")
    tsOut.write s
Loop
tsIn.Close
tsOut.Close
    
Kill filePath

但它会删除 CSV 文件中的所有换行符。

如何搜索影响我的 Excel 的换行符?

excel vba csv
3个回答
3
投票

将 CSV 作为工作簿打开,并将数据复制到活动工作表中。任何带引号的换行符都会出现在单元格内。

Option Explicit

Sub loadcsv()

    Dim ws As Worksheet, wbCSV As Workbook, n As Long
    Dim fileName As String, folder As String
    
    folder = ThisWorkbook.Path & "\"
    fileName = Dir(folder & "*.csv")
    
    Set ws = ActiveSheet
    Set wbCSV = Workbooks.Open(folder & fileName, False, True)
    With wbCSV.Sheets(1)
        n = .UsedRange.Rows.Count
        .UsedRange.Copy ws.Range("A7")
    End With
    wbCSV.Close False
    ws.Columns("A:T").AutoFit
    ws.Rows("7").Resize(n).AutoFit
    MsgBox n & " rows loaded from " & folder & fileName, vbInformation
   
End Sub

1
投票

CSV 规范 RFC4180 声明 要求是:

  • 以 (
    CR/LF
    ) 个字符结尾的 MS-DOS 样式行(最后一行可选)。

这已在 您的 CSS Linter 中得到确认,位于 “如何编写 CSV”部分
(另请参阅“常见错误”部分。)

行结尾使用

CRLF
(Windows 行结尾),列名称和字段以逗号分隔。

您的代码似乎正在删除 CRLF

您的示例 CSV 似乎使用 LF(根据我从您的链接复制/粘贴到 Notepad++ 并转到“查看→显示符号→显示所有字符”。

因此,我认为您需要将

Replace
行替换为:

s = Replace(s, vbLf, vbCrLf)

0
投票

就像@CDP1802所说和@sdplus建议一样,有一些解决方法意味着更多的工作量,但它确实可以完成工作。 我的方法是在 Excel 中粘贴 CSV 格式的字符串时触发自动解析。当您在文本编辑器中手动打开 CSV、复制内容并将其粘贴到 Excel 工作表中时,行为是相同的。

Sub LoadFileAsWorksheet(ByVal filePath As String, ByVal sheetName As String)
Dim csvSheet As Worksheet
Dim fileContent As String

' Read the file content as UTF-8
With CreateObject("ADODB.Stream")
    .Charset = "UTF-8"
    .Open
    .LoadFromFile filePath
    fileContent = .ReadText
    .Close
End With

' Create a new worksheet and set its name
Set csvSheet = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
csvSheet.Name = sheetName

' Copy the content to the clipboard
With CreateObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
    .SetText fileContent
    .PutInClipboard
End With

' Paste the content into the new worksheet
csvSheet.Paste csvSheet.Range("A1")
End Sub
© www.soinside.com 2019 - 2024. All rights reserved.