Как загрузить CSV-файл, созданный из словаря, с сущностями с помощью ServiceStack.Текст

#c# #csv #dictionary #servicestack-text

#c# #csv #словарь #servicestack-текст

Вопрос:

У меня есть словарь, в котором есть ключ: строка, значение: список объектов, где объект — это класс:

 public class Entity
{
    public string myString { get; set; }
    public int myInt { get; set; }
}

Dictionary<string, List<Entity>> myDictionary = new Dictionary<string, List<Entity>>();

List<Entity> aList = new List<Entity>();
Entity entity1 = new Entity( myString = "hi", myInt = 111);
Entity entity2 = new Entity( myString = "hello", myInt = 222);
aList.Add(entity1);
aList.Add(entity2);
myDictionary.Add("keyOne", aList);
  

Я пытаюсь использовать ServiceStack.CsvSerializer текста.SerializeToCsv() для сериализации словаря и сохранения его в CSV-файл.

 string csv = CsvSerializer.SerializeToCsv(myDictionary);
File.WriteAllText(@"testsave.csv", csv);
  

Но при запуске и проверке файла testsave.csv каждая запись в словаре сохраняется как отдельный элемент в ячейке, а элемент сохраняется горизонтально:

Пример: в словаре есть 3 записи, и они будут сохранены в формате csv следующим образом

Словарь

Итак, мой вопрос в том, правильно ли я все делаю? и если да, то как мне десериализовать csv-файл и сохранить его обратно в MyDictionary позже.

Комментарии:

1. Этот вопрос относится к ServiceStack.Text. Этот формат (который не является CSV) является чем-то специфичным для этой библиотеки. Эта библиотека должна иметь возможность десериализовать текст, который она создает. Другие приложения не смогут прочитать этот формат, хотя

2. а, понятно, спасибо, что помогли мне отредактировать его!

3. Вы уже пробовали пример ответа? Вы столкнулись с проблемой FromCsv ? В ссылке на ответ автор ServiceStack называет этот формат форматом Super CSV и публикует пример. Если вы хотите, чтобы файл использовался другими приложениями или пользователями, вам нужно быть более конкретным. Возможно, JSON было бы лучше. Или лист Excel, если это предназначено для людей

4. Да, я перешел на использование System.Text. Вместо этого используйте Json и сохраните файл в виде текстового файла. Теперь он работает нормально

Ответ №1:

CSV не очень хорошо подходит для иерархического хранения данных. Он работает так, как ожидалось.

Вы можете рассмотреть возможность перехода на сериализацию в формате json или xml, оба из которых поддерживают иерархические данные и имеют доступные библиотеки сериализации.

  • JSON.Net
  • System.Text.Json
  • System.Xml .*

Комментарии:

1. Спасибо! Вместо этого я попробую использовать эти три способа

2. Я попытался использовать System.Text. Мы с Json обнаружили, что это намного эффективнее и проще в использовании. Я также изменил свой файл с csv на txt. Спасибо за вашу помощь

Ответ №2:

Да, это правильно. Вы можете отменить его с помощью FromCsv метода:

 var dictionary = File.ReadAllText("path/to/testsave.csv")
                     .FromCsv<Dictionary<string, List<Entity>>>();
  

Вы можете прочитать об этом методе здесь .

Здесь примечательно отметить, что производный файл при использовании CsvSerializer.SerializeToCsv — это не CSV-файл со строгим определением CSV-файла, а файл, который генерирует класс CsvSerializer ServiceStack .

Комментарии:

1. За исключением того, что это не CSV-файл, поэтому у любого приложения, кроме того, которое его написало, будут проблемы с его чтением

2. Правильно, но он заявил, что это csv-файл. В противном случае это не совсем хороший подход.

3. Из вашей ссылки похоже, что автор ServiceStack называет это форматом Super CSV