我在C#中使用TextFieldParser读取CSV文件。我可以设法读取一个简单的CSV文件,但是这个CSV文件有多种格式样式,具体取决于第一列名称,如下所示:
>>Name, Age, Location,
"Joe","29","NY"
"Maggie", "25", "NJ"
>>City, State, Population
"New York", "NY","8.49"
CSV有更多类型的信息。
我尝试根据列的格式读取列,但只读取列名。如何使其只读取目标格式类型?执行此操作的代码部分位于:
while (!parser.EndOfData)
{
if (parser.ReadFields().Contains(">>Name"))
{
header = true;
string[] fields = parser.ReadFields();
if (header)
{
foreach (var val in fields)
{
dt.Columns.Add(val);
}
header = false;
continue;
}
dt.Rows.Add(fields);
}
else {};
}
编辑:
">>"当我有列名时,符号是一个标志。
答案 0 :(得分:0)
您忘记使用SetDelimeters方法指定分隔符:
using (var parser = new TextFieldParser(path))
{
parser.SetDelimiters(",");
while (!parser.EndOfData)
{
string[] results = parser.ReadFields();
if (results[0].StartsWith(">>"))
{
// headers
}
else
{
// data
}
}
}
答案 1 :(得分:0)
好像这个文件包含多个表的数据,每个下一个表的标题都以>>
开头。您可以这样填写DataSet
:
DataSet ds = new DataSet();
using (var parser = new Microsoft.VisualBasic.FileIO.TextFieldParser(@"C:\Temp\textfile.txt"))
{
parser.Delimiters = new string[] { "," };
parser.HasFieldsEnclosedInQuotes = true; // <--- !!!
string[] lineFields;
while ((lineFields = parser.ReadFields()) != null)
{
if (lineFields[0].StartsWith(">>"))
{
DataTable dt = new DataTable();
DataColumn[] cols = lineFields
.Where(t => !String.IsNullOrWhiteSpace(t))
.Select(t => new DataColumn(t.Trim(' ', '>')))
.ToArray();
dt.Columns.AddRange(cols);
ds.Tables.Add(dt);
}
else if(ds.Tables.Count > 0)
{
DataTable lastTable = ds.Tables[ds.Tables.Count - 1];
lineFields = lineFields
.Where(t => !String.IsNullOrWhiteSpace(t))
.Take(lastTable.Columns.Count)
.Select(t => t.Trim())
.ToArray();
lastTable.Rows.Add(lineFields);
}
}
}
使用您的示例数据进行测试。生成DataSet
以下两个DataTables
:
表1:
表2: