【问题标题】:Read Csv file with LineFeeds within its fields在其字段中读取带有 LineFeeds 的 Csv 文件
【发布时间】:2013-08-13 18:42:12
【问题描述】:

我有这个代码来读取一个 csv 文件:

Dim strLineValue As String
Using sr As StreamReader = File.OpenText("FilePath")

strLineValue = sr.ReadLine
      Do While strLineValue IsNot Nothing
          strLineValue = sr.ReadLine
           n += 1
      Loop
End Using

我的问题是我遇到了一个 csv 文件,其中的行是这样的:

 "Text1 LF LF text2","text3",text4,text5, , , , ,LF 
 "Text6 LF LF text8","text9",text10,text11, , , , ,LF 

其中 LF 是换行符。

所以我得到了这样的错误

Text1

text2    text3    text4    text5
Text6

text8    text9    text10   text11

关于如何克服此类文件中代码的这种错误行为的任何想法

PS。 1.如果我在 excel 中打开 csv 文件,它可以正确识别行,它只有一个多行第一个单元格
2. 我在想,也许前 2 个 LF 只是 LF,而我在每行末尾的 LF 是 LF 和 CR,但我怎么能看到差异(我在 Word 中打开了 csv 文件以查看字符)

【问题讨论】:

    标签: vb.net csv vb.net-2010


    【解决方案1】:

    您有一些用双引号括起来的字段 - "。在 CSV 文件中,这通常表明您应该获取整个字段而不是解析它。

    使用Microsoft.VisualBasic.FielIO.TextFieldParser 类很容易做到这一点。这是一个例子:

    Imports Microsoft.VisualBasic.FileIO
    
    Dim parser As TextFieldParser = New TextFieldParser("TestFile.txt")
    
    parser.Delimiters = New String() {","}
    parser.HasFieldsEnclosedInQuotes = True
    
    While Not parser.EndOfData
    
        Dim fields As String() = parser.ReadFields()
    
    End While
    

    这将保留引用字段中的换行符:

    "Text1 LF LF text2" "text3" "text"4 "text5" blank blank blank blank blank
    

    【讨论】:

    • 问题是不是所有的数据都在引号中
    • @Nianios - 没关系。 TextFieldParser 将处理具有混合字段的行 - 引用和未引用 - 很好。我上面发布的代码示例是在您的示例输入上运行的,我发布的输出是读取字段后第一行的数组元素。
    • 对我来说,当字段没有包含在 "" 中时它不起作用 :-( 它会将 LF 视为行尾,一切都搞砸了
    【解决方案2】:

    我会尝试;

    strLineValue = strLineValue.replace(vblf,"")
    

    并且看到它确实在行尾有一个 CR...

    您可以在 HEX 编辑器中看到区别,lf = 10 和 cr=13

    chr(10) & chr(13) = vbcrlf
    

    【讨论】:

    • 这是一个可行的解决方案,但如果单元格中的数据是多行的,OP 可能希望保留格式。
    • 你是对的。 LF 为 0A,LFCR 为 0A 0D。所以我有两个 LF,然后是一个 LFCR。那么我如何在代码中克服这个问题。你的代码不起作用 strLineValue 为 null
    • @Tim : 他不在乎(显然我们需要一个空格而不是 LF)
    猜你喜欢
    • 2015-12-11
    • 2012-01-08
    • 1970-01-01
    • 2018-05-27
    • 2014-10-28
    • 2020-08-14
    • 1970-01-01
    • 2020-06-23
    • 1970-01-01
    相关资源
    最近更新 更多