我想在现有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文件并使用以下步骤:
Ctrl + H
打开Find and Replace
对话框。Find What
文本框中,我使用Ctrl + J
输入换行符。我按照说明here 我尝试使用ReadAllText
,但写入后行的顺序不正确。
在VB.NET中使用Excel时是否还有其他相同的方式?
答案 0 :(得分:1)
使用从Excel保存的CSV文件,如果单元格中有换行符,则该单元格值将用双引号引起来,并且该换行符用Chr(10)表示。
例如,
另存为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,来配置。
例如,使用上述数据,
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中打开以提供:
您可能需要使其比仅在带有Chr(10)的条目周围加上双引号更健壮,例如,带有逗号的条目也需要定界符。
我编写它的目的还在于用逗号分隔字段,尽管示例数据中未显示。
当然,一旦有了数组thisLine
中一行的各个条目,就可以根据需要用空格替换Chr(10)。