用空字符串替换换行符

时间:2018-10-10 06:33:27

标签: excel vb.net csv

我想在现有CSV数据中添加一个空白字段的新列。

我当前的代码如下:

  Dim data As IEnumerable(Of String) =
                                File.ReadLines(filename,Encoding.GetEncoding("iso-8859-1")).
                                Select(Function(line, index)
                                           If index = 0 Then
                                               Return "new_column," & line
                                           Else
                                               Return "," & line
                                           End If
                                       End Function)

                               File.WriteAllLines(savePath, data)

问题是在换行符上添加了“ new_column”。因此,我要做的是在Excel中打开CSV文件并使用以下步骤:

  1. Ctrl + H打开Find and Replace对话框。
  2. Find What文本框中,我使用Ctrl + J输入换行符。我按照说明here

我尝试使用ReadAllText,但写入后行的顺序不正确。

在VB.NET中使用Excel时是否还有其他相同的方式?

1 个答案:

答案 0 :(得分:1)

使用从Excel保存的CSV文件,如果单元格中有换行符,则该单元格值将用双引号引起来,并且该换行符用Chr(10)表示。

例如,

library documentation

另存为CSV文件并在十六进制编辑器中打开会给出(注意:十进制10 = 0A十六进制)

43 6F 6C 20 41 2C 43 6F 6C 20 42 2C 22 4C 69 6E Col A,Col B,"Lin
65 0A 62 72 65 61 6B 22 2C 43 6F 6C 20 44 0D 0A e·break",Col D··

因此,您需要将双引号字符串内的换行符视为不是换行符。

可以通过将.HasFieldsEnclosedInQuotes属性设置为True,来配置enter image description here

例如,使用上述数据,

Option Infer On
Option Strict On

Imports System.IO
Imports System.Text.RegularExpressions
Imports Microsoft.VisualBasic.FileIO

Module Module1

    Sub Main()
        Dim src = "C:\temp\Book1.csv"
        Dim dest = "C:\temp\newColumn.csv"

        Using tfp As New TextFieldParser(src)
            tfp.HasFieldsEnclosedInQuotes = True
            tfp.Delimiters = {","}
            Dim re As New Regex("[,\n]")

            Using sw As New StreamWriter(dest, False, Text.Encoding.GetEncoding("iso-8859-1"))
                While Not tfp.EndOfData
                    Dim thisLine = tfp.ReadFields()
                    sw.WriteLine("new_column," & String.Join(",", thisLine.Select(Function(p) If(re.IsMatch(p), Chr(34) & p & Chr(34), p))))
                End While
            End Using

        End Using

    End Sub

End Module

产生

6E 65 77 5F 63 6F 6C 75 6D 6E 2C 43 6F 6C 20 41 new_column,Col A
2C 43 6F 6C 20 42 2C 22 4C 69 6E 65 0A 62 72 65 ,Col B,"Line·bre
61 6B 22 2C 43 6F 6C 20 44 0D 0A                ak",Col D··

哪些可以在Excel中打开以提供:

TextFieldParser

您可能需要使其比仅在带有Chr(10)的条目周围加上双引号更健壮,例如,带有逗号的条目也需要定界符。

我编写它的目的还在于用逗号分隔字段,尽管示例数据中未显示。

当然,一旦有了数组thisLine中一行的各个条目,就可以根据需要用空格替换Chr(10)。