2012-05-30 2 views
13

Мне было интересно, если кто-то написал утилиту для преобразования CSV-файла в Json с помощью C#. Из предыдущего вопроса о stackoverflow я знаю эту приятную утилиту - https://github.com/cparker15/csv-to-json и на данный момент я планирую обратиться к ней, но существующая реализация C# будет очень полезна! Благодаря!Преобразование csv-файла в json с использованием C#

+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

Я бы не использовал Office.Interop в CSV-файле, это было бы излишним, поскольку CSV - это просто текст. – tlehman

ответ

1

С этого same SO answer есть ссылка на this post.

метод CsvToJson продление

/// <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(); 
} 

Там, как представляется, проблема с тем, где некоторые методы, вызываемые в пределах вышеуказанного расширения реального времени (см комментарии оригинальной записи в блоге), но вы должны получить большинство путь там.

EDITanother SO answer о разделении строки CSV. Вы можете использовать один из предложенных решений регулярных выражений, чтобы создать свой собственный 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

yes, но 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 - открытая библиотека источника доступны для выполнения преобразования CSV в формате JSON легко с несколькими строками кода

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

заказ CodeProject статьи для некоторой дополнительной помощи.

Отказ от ответственности: Я являюсь автором этой библиотеки.

Смежные вопросы