Преобразование потока csv в JSON с использованием ChoETL. Json сбой - PullRequest
0 голосов
/ 06 мая 2020

В моем приложении я получаю поток csv и пытаюсь динамически преобразовать поток Csv в JSON JToken. Здесь я не буду знать столбцы в CSV, поэтому не могу определить сопоставление. Чтобы преобразовать этот поток в JSON, я использую ChoETL. Json CsvReader, но он не может преобразовать какое-то значение, поскольку он обрабатывает строку как тип DatTime. Вот пример функции, созданной для репликации проблемы

public static void ConvertCsvStream()
        {
            JToken result = null;
            string delemeter = ",";
            string csvText = "\"Invoice Number\"\n\"1583-03\"\n\"1589-00\"";
            try
            {
                Stream stream = new MemoryStream(Encoding.UTF8.GetBytes(csvText));
                using (StreamReader reader = new StreamReader(stream))
                {
                    using (var csv = new ChoCSVReader(reader).WithFirstLineHeader().WithDelimiter(delemeter))
                    {
                        result = JToken.FromObject(csv);
                    }
                }
            }
            catch(Exception ex)
            {

            }


        //return JToken.FromObject(sb.ToString());
    }

Это вызывает ошибку

Can't convert '1589-00' value from 'System.String' type to 'System.DateTime' type

Для некоторых значений он может преобразовывать, но с учетом значений как DateTime

{[{"Invoice Number": "1583-02-01T00:00:00"}, {"Invoice Number": "1583-03-01T00:00:00"}]}

Может ли кто-нибудь помочь с этим? Я не смогу создать модель для csv, так как я не буду знать столбцы

Edit

после обновления пакета до новой версии, я смог создать метод для преобразования потока csv в JToken

public static JToken ConvertCsvStream(Stream stream,string delemeter)
        {
            if (string.IsNullOrWhiteSpace(delemeter))
                delemeter = ",";

            using (StreamReader reader = new StreamReader(stream))
            {
                using (var csv=new ChoCSVReader(stream).QuoteAllFields().WithFirstLineHeader().WithDelimiter(delemeter))
                {
                    return JToken.FromObject(csv);
                }
            }
        }

1 Ответ

0 голосов
/ 06 мая 2020

Это ошибка библиотеки, когда "1583-03" обрабатывается как дата-время с использованием автоматического обнаружения типов. Для исправления возьмите последний (1.2.0.1) пакет nuget.

Вот рабочий пример

string csvText = "\"Invoice Number\"\n\"1583-03\"\n\"1589-00\"";

StringBuilder json = new StringBuilder();
using (var r = ChoCSVReader.LoadText(csvText)
    .WithFirstLineHeader()
    .QuoteAllFields()
    )
{
    using (var w = new ChoJSONWriter(json))
        w.Write(r);
}
Console.WriteLine(json.ToString());

Вывод:

[
 {
  "Invoice Number": "1583-03"
 },
 {
  "Invoice Number": "1589-00"
 }
]
...