2011-06-18 44 views
2

我正在從Google Insights下載CSV,並且需要解析某些信息並使用該數據填充熱圖。如何使用C解析從Google Insights下載的CSV

Google沒有針對Insights的開放式API,因此您只能下載CSV並解析出來。

有大量數據時所下載,而是圍繞行61我需要的數據開始,接着約40行數據如下:

... 
... above data 
.... 
Top subregions for test 
Subregion test 
New York 100 
Ohio 79 
Kentucky 72 
Maine 66 
New Jersey 64 
District of Columbia 58 
Pennsylvania 58 
Delaware 58 
Maryland 57 
Massachusetts 52 

我能夠加載CSV - 我只是不確定如何正確解析出特定的數據。我通過CSV循環直到找到「子區域」文本 - 但之後我不確定如何將狀態翻出來並計入某種字典中。

任何幫助將不勝感激。

謝謝!

回答

2
class Program 
{ 
    static void Main() 
    { 
     foreach (var item in GetRegions("google_insights.txt")) 
     { 
      Console.WriteLine("Count = {0}, Name = {1}", item.Value, item.Key); 
     } 
    } 

    private static Regex _regionRegex = new Regex(
     @"^(?<name>.+)\s(?<count>[0-9]+)$", 
     RegexOptions.Compiled 
    ); 

    static IEnumerable<KeyValuePair<string, int>> GetRegions(string filename) 
    { 
     using (var file = File.OpenRead(filename)) 
     using (var reader = new StreamReader(file)) 
     { 
      string line; 
      bool yielding = false; 
      while ((line = reader.ReadLine()) != null) 
      { 
       if (yielding && string.IsNullOrWhiteSpace(line)) //IsNullOrEmpty works as well 
       { 
        yield break; 
       } 

       if (yielding) 
       { 
        var match = _regionRegex.Match(line); 
        if (match.Success) 
        { 
         var count = int.Parse(match.Groups["count"].Value); 
         var name = match.Groups["name"].Value; 
         yield return new KeyValuePair<string, int>(name, count); 
        } 
       } 

       if (line.Contains("subregions")) 
       { 
        yielding = true; 
       } 
      } 
     } 

    } 
} 
+0

哥們你真棒。我假設String.IsNullOrWhiteSpaces是一樣的String.IsNullOrEmpty? –

+0

@Jack Marchetti,不,它不一樣,否則它不會存在:-)'IsNullOrWhiteSpaces'是在.NET 4.0中引入的,除了檢查空字符串和空字符串以外,它還檢查字符串是否只包含空格字符。如果你不使用.NET 4.0,你可以執行下面的測試:'if(string.IsNullOrEmpty((line?string.Empty).Trim()))' –

+0

gotcha。我認爲它仍然有效。我注意到你使用「count」作爲你的鍵,而不是狀態。我改變了這一點。 –

0

我強烈建議你看看TextFieldParser。此外,請參閱右側的「相關」問題。

0

上面粘貼的內容看起來不像CSV格式,因爲逗號在哪裏?對於CSV解析,在stackoverflow上搜索CSV正則表達式,有幾個非常好的建議。 但是,如果你的數據看起來像你上面粘貼的,如果你想要的是迭代您的數據(它是用空格和/或製表符,而不是逗號分隔),並填充字典,你可以做這樣的事情:


Dictionary<string, int> data = new Dictionary<string,int>(); 
string line = null; 
while ((line = ReadLine()) != null) /*ReadLine() is what you currently use to read next line from your input*/ 
{ 
string[] items = line.Split(new char[]{' ', '\t'}, StringSplitOptions.RemoveEmptyEntries); 
string state= items[0]. 
int count = int.Parse(items[1]); 
data.Add(state, count); 
} 
+0

這也是問題的一部分。谷歌稱它是一個CSV,但它不是 –