2012-05-30 44 views
13

我想知道是否有人編寫了一個實用程序來使用C#將CSV文件轉換爲Json。從上一個關於stackoverflow的問題,我知道這個很好用的工具 -​​,此刻我打算引用它,但現有的C#實現將非常有幫助!謝謝!使用C#將csv文件轉換爲json#

+0

您可以輕鬆地將JS代碼轉譯爲C#,您也可以在'var'關鍵字中留下。 – tlehman

+0

是的,這就是我打算做的,但唯一的文章,我可以找到,這一個MSDN http://social.msdn.microsoft.com/Forums/en-US/vsto/thread/b6e8a28c-6760-4e86 -a1aa-e2ce9ec36380 /使用Office.Interop,我是C#的新手,並且不太熟悉它。我是否需要使用它或者應該善於翻譯js實用程序?謝謝! – user1427026

+3

我會避免使用CSV文件上的Office.Interop,這將是過度殺傷,因爲CSV只是文本。 – tlehman

回答

1

從那same SO answer,有一個鏈接到this post

CsvToJson extention方法

/// <summary> 
/// Converts a CSV string to a Json array format. 
/// </summary> 
/// <remarks>First line in CSV must be a header with field name columns.</remarks> 
/// <param name="value"></param> 
/// <returns></returns> 
public static string CsvToJson(this string value) 
{ 
    // Get lines. 
    if (value == null) return null; 
    string[] lines = value.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); 
    if (lines.Length < 2) throw new InvalidDataException("Must have header line."); 

    // Get headers. 
    string[] headers = lines.First().SplitQuotedLine(new char[] { ',' }, false); 

    // Build JSON array. 
    StringBuilder sb = new StringBuilder(); 
    sb.AppendLine("["); 
    for (int i = 1; i < lines.Length; i++) 
    { 
     string[] fields = lines[i].SplitQuotedLine(new char[] { ',', ' ' }, true, '"', false); 
     if (fields.Length != headers.Length) throw new InvalidDataException("Field count must match header count."); 
     var jsonElements = headers.Zip(fields, (header, field) => string.Format("{0}: {1}", header, field)).ToArray(); 
     string jsonObject = "{" + string.Format("{0}", string.Join(",", jsonElements)) + "}"; 
     if (i < lines.Length - 1) 
      jsonObject += ","; 
     sb.AppendLine(jsonObject); 
    } 
    sb.AppendLine("]"); 
    return sb.ToString(); 
} 

有似乎是其中一些方法稱爲上面延伸直播中(見原博客文章的評論)的問題,但它應該讓你最那裏的路。

編輯這是關於分割CSV行的another SO answer。您可以使用正則表達式建議的解決方案之一,以創建自己的SplitQuotedLine方法:

public static string SplitQuotedLine(this string value, char separator, bool quotes) { 
    // Use the "quotes" bool if you need to keep/strip the quotes or something... 
    var s = new StringBuilder(); 
    var regex = new Regex("(?<=^|,)(\"(?:[^\"]|\"\")*\"|[^,]*)"); 
    foreach (Match m in regex.Matches(value)) { 
     s.Append(m.Value); 
    } 
    return s.ToString(); 
} 

我沒有測試以上,所以請原諒我,如果我犯了任何錯誤。

此外,它會出現Zip is a LINQ extension method,以便照顧這個問題。

+0

是的,但SplitQuotedLine - 這是用戶定義的方法,從博客文章中缺失 – user1427026

+0

即使沒有看到該方法內發生了什麼,它很容易告訴它只是分割一個字符串。 'lines.First()。Split(',')'基本上會做同樣的事情 - 它可能只是測試任何引用的逗號,並可能將引號也刪除。 'Zip'的擴展名可能會更有意思。就像我說過的那樣,它可以讓你大部分時間都在那裏。我想你正在尋找100%完成的東西,因爲你是C#的新手,對嗎? –

+0

當然,我希望它能解決問題。就像我剛剛說的,我只是作爲一個例子發佈,我沒有嘗試。它應該工作,但可能需要一些小的調整,但沒有保證! :) –

11

如果你可以使用System.Web.Extensions,像這樣可以工作:

var csv = new List<string[]>(); // or, List<YourClass> 
var lines = System.IO.File.ReadAllLines(@"C:\file.txt"); 
foreach (string line in lines) 
    csv.Add(line.Split(',')); // or, populate YourClass   
string json = new 
    System.Web.Script.Serialization.JavaScriptSerializer().Serialize(csv); 

你可能有更復雜的分析要求,爲csv文件,你可能有從一個行封裝數據的一類,但要點在於,只要有一行行集合,就可以用一行代碼序列化爲JSON。

+0

如果文件很大,這通常會導致錯誤。 例如:使用JSON JavaScriptSerializer進行序列化或反序列化時出錯。字符串的長度超過了maxJsonLength屬性 – Kurkula

0

我找出了答案這個問題終於解決了我就用字典

public static void CreateJsonFromCSV() 
{ 
    string path = "C:\\Users\\xx\\xx\\xx\\xx\\lang.csv"; 
    string textFilePath = path; 
    const Int32 BufferSize = 128; 

    using (var fileStream = File.OpenRead(textFilePath)) 
    using (var streamReader = new StreamReader(fileStream, Encoding.UTF8, true, BufferSize)) 
    { 
     String line; 
     Dictionary<string, string> jsonRow = new Dictionary<string, string>(); 

     while ((line = streamReader.ReadLine()) != null) 
     { 

      string[] parts = line.Split(','); 

      string key_ = parts[0]; 
      string value = parts[1]; 


      if (!jsonRow.Keys.Contains(key_)) 
      { 
       jsonRow.Add(key_, value); 
      } 

     } 
     var json = new JavaScriptSerializer().Serialize(jsonRow); 
     string path_ = "C:\\XX\\XX\\XX\\XX\\XX.csv"; 
     File.WriteAllText(path_, json); 
    } 

} 
+0

上設置的值,你是Anak ... – Leon

0

請務必添加以下web.config中你解析大CSV文件之前。

<system.web.extensions> 
     <scripting> 
      <webServices> 
       <jsonSerialization maxJsonLength="50000000"/> 
      </webServices> 
     </scripting> 
    </system.web.extensions> 
0

Cinchoo ETL - 提供一個開放源碼庫的幾行代碼

using (var p = new ChoCSVReader("sample.csv").WithFirstLineHeader()) 
{ 
    using (var w = new ChoJSONWriter("sample.json")) 
    { 
     w.Write(p); 
    } 
} 

結帳CodeProject上的文章對一些額外的幫助做CSV轉化爲JSON容易。

聲明:我是該庫的作者。