Cal*_*ins 5 c# csv textfieldparser
使用Microsoft.VisualBasic.FileIO中的TextFieldParser,可以解析CSV文件,如下所示:
using (TextFieldParser parser = new TextFieldParser(CSVPath))
{
parser.TextFieldType = FieldType.Delimited;
parser.SetDelimiters(",");
parser.HasFieldsEnclosedInQuotes = true;
while (!parser.EndOfData) { string[] fields = parser.ReadFields(); }
}
Run Code Online (Sandbox Code Playgroud)
但是,这依赖于使用CSV文件路径初始化TextFieldParser.是否可以产生相同的效果,但在传递包含数据记录本身的字符串时?
例如,对于Data1,6.5,"Data3 ""MoreData"""保存在字符串变量中的值为(注意由于转义的引号引用的引号括起来的最后数据)的CSV数据记录,我可以将数据转换为字符串数组,如下所示:
[0] = "Data1"
[1] = "6.5"
[2] = "Data3 \"MoreData\""
Run Code Online (Sandbox Code Playgroud)
Cal*_*ins 12
包含原始字符串的StringReader可以传递给新的TextFieldParser并以相同的方式处理.
StringReader sr = new StringReader("Data1,6.5,\"Data3,\"\"MoreData\"\"\"");
using (var parser = new TextFieldParser(sr))
{
parser.TextFieldType = FieldType.Delimited;
parser.SetDelimiters(",");
parser.HasFieldsEnclosedInQuotes = true;
while (!parser.EndOfData)
{
Console.WriteLine("Line:");
var fields = parser.ReadFields();
foreach (var field in fields)
{
Console.WriteLine("\tField: " + field);
}
}
}
Run Code Online (Sandbox Code Playgroud)
输出到控制台:
Line:
Field: Data1
Field: 6.5
Field: Data3,"MoreData"
Run Code Online (Sandbox Code Playgroud)
您还可以从Stream或TextReader实例化TextFieldParser.它不必是字符串路径.因此,只要您可以将其整合到流中,您就可以将它真正地流式传输.可能只是一个MemoryStream.
例如
using (var stream = new MemoryStream())
{
var input = "A, B, C, D\r\n";
input += "Jeremy,Paul,Linda,Joe\r\n";
var bytes = System.Text.Encoding.Default.GetBytes(input);
stream.Write(bytes, 0, bytes.Length);
stream.Seek(0, SeekOrigin.Begin);
using (var parser = new TextFieldParser(stream))
{
parser.TextFieldType = FieldType.Delimited;
parser.SetDelimiters(",");
parser.HasFieldsEnclosedInQuotes = true;
while (!parser.EndOfData)
{
Console.WriteLine("Line:");
var fields = parser.ReadFields();
foreach (var field in fields)
{
Console.WriteLine("\tField: " + field);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5959 次 |
| 最近记录: |