2016-02-14 239 views
3

我有一个CSV文件,但分隔符是分号;,每列都用双引号括起来。还有的;出现在一些价值观,如& amp;解析半角冒号分隔符文件

我使用TextFieldParser来解析文件。这是样本数据:

"A001";"RT:This is a tweet"; "http://www.whatever.com/test/module & amp;one"

对于上面的例子,我得到比我应该得到什么更多的列/字段。

Field[0] = "A001"
Field[1] = "RT:This is a tweet"
Field[2] = "http://www.whatever.com/test/module&amp"
Field[3] = "one"

这是我的代码。处理这种情况需要做些什么改变?

using (var parser = new TextFieldParser(fileName)) 
      { 
       parser.TextFieldType = FieldType.Delimited; 
       parser.SetDelimiters(";"); 
       parser.TrimWhiteSpace = true; 
       parser.HasFieldsEnclosedInQuotes = false; 

       int rowIndex = 0; 
       PropertyInfo[] properties = typeof(TwitterData).GetProperties(); 
       while (parser.PeekChars(1) != null) 
       { 
        var cleanFieldRowCells = parser.ReadFields().Select(
         f => f.Trim(new[] { ' ', '"' })); 

        var twitter = new TwitterData(); 
        int index = 0; 
        foreach (string c in cleanFieldRowCells) 
        { 
          string str = c; 

          if (properties[index].PropertyType == typeof(DateTime)) 
          { 
           string twitterDateTemplate = "ddd MMM dd HH:mm:ss +ffff yyyy"; 
           DateTime createdAt = DateTime.ParseExact(str, twitterDateTemplate, new System.Globalization.CultureInfo("en-AU")); 
           properties[index].SetValue(twitter, createdAt); 
          } 
          else 
          { 
           properties[index].SetValue(twitter, str); 
          } 

         index++; 
        } 
       } 

-Alan-

+0

你尝试HasFieldsEnclosedInQuotes''设置为true? – kuujinbo

+0

是的,但没有不同 –

+0

尝试在每一行上调用System.Net.WebUtility.HtmlDecode()。它会将'&'变成'&',以及解码任何其他内容。 – kuujinbo

回答

2

使用您有上述两个样本串并设置HasFieldsEnclosedInQuotes属性为true对我的作品。

string LINES = @" 
    ""A001"";""RT:This is a tweet""; ""http://www.whatever.com/test/module&one"" 
    ""A001"";""RT: Test1 ; Test2"";""test.com""; 
"; 
using (var sr = new StringReader(LINES)) 
{ 
    using (var parser = new TextFieldParser(sr)) 
    { 
     parser.TextFieldType = FieldType.Delimited; 
     parser.SetDelimiters(";"); 
     parser.TrimWhiteSpace = true; 
     parser.HasFieldsEnclosedInQuotes = true; 

     while (parser.PeekChars(1) != null) 
     { 
      var cleanFieldRowCells = parser.ReadFields().Select(
       f => f.Trim(new[] { ' ', '"' })).ToArray(); 
      Console.WriteLine("New Line"); 
      for (int i = 0; i < cleanFieldRowCells.Length; ++i) 
      { 
       Console.WriteLine(
        "Field[{0}] = [{1}]", i, cleanFieldRowCells[i] 
       ); 
      } 
      Console.WriteLine("{0}", new string('=', 40)); 
     } 
    } 
} 

OUTPUT:

New Line 
Field[0] = [A001] 
Field[1] = [RT:This is a tweet] 
Field[2] = [http://www.whatever.com/test/module&amp;one] 
======================================== 
New Line 
Field[0] = [A001] 
Field[1] = [RT: Test1 ; Test2] 
Field[2] = [test.com] 
Field[3] = [] 
======================================== 
+0

以上工作正常。但是,如果我将LINES复制到文件并从文件(File.ReadAllText)中读取内容,我会收到异常(“无法使用当前分隔符分析第1行”) –

+0

@AlanB - 您不能只复制' LINES'原样,因为它是一个** C#逐字字符串**。即双引号会被转义。相反,文本文件[应该看起来像这样](https://raw.githubusercontent.com/kuujinbo/StackOverflow.RegularExpressions/master/_INPUT/TextFieldParseRegex.txt),然后您可以将路径传递到文本文件在你原来的例子中做了,而不是使用'File.ReadAllText()'。 [看看更新](https://github.com/kuujinbo/StackOverflow.RegularExpressions/blob/master/CSharp/TextFieldParseRegex.cs)。 – kuujinbo