使用TextFieldParser根据值来读取列

时间:2015-12-07 13:51:43

标签: c# .net csv

我在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 {};
}

编辑:

">>"当我有列名时,符号是一个标志。

2 个答案:

答案 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:

enter image description here

表2:

enter image description here