opt*_*ime 5 vb.net file-io textfieldparser
我正在使用TextFieldParserClass来读取逗号分隔值(.csv)文件.此文件中的字段用双引号括起来"Field1","Field2".
因此,要读取文件,我将object 的HasFieldsEnclosedInQuotes属性设置TextFieldParser为true.但是我得到一个错误,MalformedLineException当任何字段在开头包含双引号("+")时.
示例:""Field2"with additional"这里我应该"Field2" with additional看作输出.
但是,如果"除了第一个位置以外的任何地方那么它工作正常 像线条一样"Field2 "with" additional"完美地工作,并给我Field2 "with" additional
输出.
有没有人有同样的问题?有什么办法可以解决这个问题吗?
这是我的代码:
Private Sub ReadTextFile(ByVal txtFilePath As String)
Dim myReader As tfp = New Microsoft.VisualBasic.FileIO.TextFieldParser(txtFilePath)
myReader.Delimiters = New String() {","}
myReader.TextFieldType = FileIO.FieldType.Delimited
myReader.HasFieldsEnclosedInQuotes = True
myReader.TrimWhiteSpace = True
Dim currentRow As String()
Dim headerRow As Integer = 0
While Not myReader.EndOfData
Try
currentRow = myReader.ReadFields()
'Read Header
If (headerRow = 0) Then
'Do work for Header Row
headerRow += 1
Else
'Do work for Data Row
End If
Catch ex As Exception
Dim errorline As String = myReader.ErrorLine
End Try
End While
End Sub
Run Code Online (Sandbox Code Playgroud)
这是我在csv文件中的数据:
"Column1","Column2","Column3" "Value1","Value2",""A" Block in Building 123"
您的示例""A" Block"是格式错误的CSV; 因此,TextFieldParser完全有权拒绝它.该CSV标准说:
7. If double-quotes are used to enclose fields, then a double-quote
appearing inside a field must be escaped by preceding it with
another double quote. For example:
"aaa","b""bb","ccc"
Run Code Online (Sandbox Code Playgroud)
如果您正确编码数据,即......
"Column1","Column2","Column3"
"Value1","Value2","""A"" Block in Building 123"
Run Code Online (Sandbox Code Playgroud)
... TextFieldParser工作正常并正确返回"A" Block in Building 123.
因此,第一步是告诉生成CSV文件的人创建一个有效的CSV文件,而不是看起来像CSV的东西.
如果你不能这样做,你可能想要在文件中进行两次传递:
Ale*_*ici -1
[原答案]
尝试这个:
using System;
using System.IO;
using System.Linq;
class Test
{
static void Main()
{
var file = "Test.txt";
var r = File.ReadAllLines(file)
.Select((i, index) => new { Line = index, Fields = i.Split(new char[] { ',' }) });
// header
var header = r.First();
// do work for header
for (int j = 0; j < header.Fields.Count(); j++)
{
Console.Write("{0} ", header.Fields[j].Substring(1, header.Fields[j].Length-2));
}
Console.WriteLine();
var rows = r.Skip(1).ToList();
// do work for rows
for (int i = 0; i < rows.Count; i++)
{
for (int j = 0; j < rows[i].Fields.Count(); j++)
{
Console.Write("{0} ", rows[i].Fields[j].Trim(new[] { '"' }));
}
Console.WriteLine();
}
}
}
Run Code Online (Sandbox Code Playgroud)
注意:我用 C# 发布,因为问题仍然被标记为它。
由于 C# 标签已消失,请参阅http://converter.telerik.com/获取将代码转换为 VB 的帮助。
[更新答案]
尝试不同的方法(这次是在 VB.Net 中):
Imports System
Imports System.IO
Imports System.Linq
Class Test
Public Shared Sub Main()
Dim file__1 = "Test.txt"
Dim r = File.ReadAllLines(file__1).[Select](Function(i, index) New With { _
.Line = index, _
.Fields = i.Substring(1, i.Length - 2).Split(New String() {""","""}, StringSplitOptions.None) _
})
' header
Dim header = r.First()
' do work for header
For j As Integer = 0 To header.Fields.Count() - 1
Console.Write("{0} ", header.Fields(j))
Next
Console.WriteLine()
Dim rows = r.Skip(1).ToList()
' do work for rows
For i As Integer = 0 To rows.Count - 1
For j As Integer = 0 To rows(i).Fields.Count() - 1
Console.Write("{0} ", rows(i).Fields(j))
Next
Console.WriteLine()
Next
End Sub
End Class
Run Code Online (Sandbox Code Playgroud)