2016-02-14 36 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