2009-10-03 4 views
3

Я уже давно заинтересован в файлах CSV, но мне никогда не приходилось их использовать до сих пор, поэтому я довольно новичок в этом.Файлы с разделенными запятыми (чтение/запись) - C#

У меня есть приложение, в котором хранится информация о элементах управления, которые были созданы пользователем во время выполнения. Я планирую использовать CSV-файлы для хранения этой информации, которая позже будет извлечена пользователем, когда они откроют файл в моей программе.

Эти файлы CSV будут иметь следующую структуру. Скажем, например, пользователь создает LinkLabel, присваивает ему некоторый текст, а затем создает ярлык и присваивает ему некоторый текст. Выходной файл (CSV-файл) будет выглядеть следующим образом:

CSVFile.csv


LinkLabel,This is LinkLabel's text,170,40 
Label,This is Label's text,170,50 

Объяснение:


Control,Text,LocationX,LocationY 
Control,Text,LocationX,LocationY 

..So, как вы можете видеть, информация будет всегда быть одинаковым. Control, Text, LocationX, LocationY ...

Может ли кто-нибудь указать мне на любые хорошие, понятные ресурсы, где я могу научиться писать такой файл? А потом извлеките эту информацию?

Thanks, Jason.

ответ

3

Я бы избежал файла csv и, возможно, скорее использовал xml-файл. Это даст вам гораздо больше гибкости и поддерживает читателей.

+0

Можете ли вы какие-нибудь хорошие рекомендую сайты, чтобы начать обучение XML для C#? Я действительно это рассматривал, но я не мог найти никаких полезных сайтов об этом. –

+0

+1 Как правило, я бы использовал XML, если файлы должны быть доступны через другие приложения и двоичную сериализацию в противном случае. –

+0

Aggreed, xml просто делает его доступным для человека/редактируется –

-2

Ваш вопрос в основном заключается в том, как писать в файл.

Google и прочитайте несколько примеров.

В основном вы смотрите на создание экземпляра класса FileStream и запись на диск.

Я бы опубликовал пример, но в лучшем случае вы сначала изучаете битку, а затем отправляете более конкретный вопрос.

Запись в CSV по существу просто записывается в текстовый файл.

+0

Судя по пример кода для файлов CSV, которые я нашел в Интернете, сильно отличается от написания простых старых текстовых файлов, и, похоже, для него также много чего. –

+0

CSV-файл - это просто обычный текстовый файл, поэтому имя файла с разделителями-запятыми. –

+0

Да, это «простой» текстовый файл, но логика создания «coorect» csv немного больше дополняет. excel довольно хорошо покрывается форматированием ячейки и значениями, которые содержат разделительный делитель. Нет, это не так просто, как просто написать собственный текстовый файл. –

3

Я использую отличную и бесплатную библиотеку FileHelpers для обработки CSV-файлов. Тем не менее я не уверен, что вы действительно должны использовать CSV-файл для того, что вы пытаетесь сделать.

Here вы можете видеть, как другие реализовали аналогичную функцию.

2

Интересно, не сделает ли xaml большую часть того, что вы хотите бесплатно? Но если вы хотите сделать заказные данные, я бы тоже предположил, что у csv был свой день, особенно когда данные становятся сложными. Полный пример XML (написанном для пространства, так что игнорировать форматирование):

using System; 
using System.Collections.Generic; 
using System.Xml.Serialization; 
public enum ControlType { 
    Label, LinkLabel 
} 
[XmlRoot("controls")] 
public class ControlWrapper { 
    [XmlElement("control")] public List<ControlDto> Controls { get; set; } 
    public ControlWrapper() { 
     Controls = new List<ControlDto>(); 
    } 
} 
public class ControlDto { 
    [XmlAttribute("type")] public ControlType Type { get; set; } 
    [XmlAttribute("caption")] public string Caption { get; set; } 
    [XmlAttribute("x")] public int LocationX { get; set; } 
    [XmlAttribute("y")] public int LocationY { get; set; } 
} 
static class Program { 
    static void Main() { 
     var model = new ControlWrapper { 
      Controls = { 
       new ControlDto { 
        Type = ControlType.LinkLabel, 
        Caption = "This is LinkLabel's text", 
        LocationX = 170, LocationY = 40 
       }, new ControlDto { 
        Type = ControlType.Label, 
        Caption = "This is Label's text", 
        LocationX = 170, LocationY = 50 
       } 
      } 
     }; 
     var ser = new XmlSerializer(typeof(ControlWrapper)); 
     ser.Serialize(Console.Out, model); 
    } 
} 

Таким образом, вы в основном иметь дело с моделью объекта, а не сериализации. Действительно, было бы тривиально модифицировать приведенное выше, чтобы использовать DataContractSerializer (для WCF), protobuf-net (переносное двоичное) и т. Д.

0

Не существует определенного стандарта для того, как файл CSV должен работать, поэтому использование их проблематично , Я бы рекомендовал использовать XML вместо этого, так как есть четкий стандарт, на который вы можете ссылаться.

Некоторых вещей, что делает формат CSV проблематичный:

  • Значение может содержать разрывы строк, так что вы не можете прочитать файл построчно.
  • Некоторые файлы не разделены запятой, но точка с запятой разделена.
  • В некоторых файлах есть длина строк в зазубринах, то есть линии с различным количеством элементов.
  • Поскольку нет правил о том, как значения должны быть указаны и экранированы, сложно написать синтаксический анализатор, который может обрабатывать по-разному, что он решен.
+0

Возможно, это не стандарт, но есть RFC 4180 http://tools.ietf.org/html/rfc4180 http://en.wikipedia.org/wiki/Comm-separated_values, но я согласен с тем, что часто возникают проблемы с CSV. –

+0

@ Jonas: Это хороший обзор, это было бы удобно, когда я написал парсер CSV, но потом он еще не был опубликован ...Обратите внимание, что MS Excel создает CSV-файлы, которые не соответствуют этим определениям (т. Е. Неровным линиям). – Guffa

2

Как более легкий вес альтернативы XML, JSON предоставляет вам все, что , которое вы, кажется, ищете. JSON - это просто способ сериализации ваших объектов в строки , подходящие для записи в файл, для последующего поиска.

Существует активное сообщество пользователей JSON, которые используют модуль JSONSharp jsonsharp overview.

Для обсуждения о том, почему XML (может) быть вредно для вашего здоровья есть чрезвычайно полезный пост здесь: xml is bad for humans

вернуться к вашему вопросу о CSV файлах, C# на самом деле не содержит каких-либо решений для записи и чтение файлов csv, а также другие , ваш первый порт захода должен быть одной из многих библиотек, которые имеют , чтобы заполнить пустоту.

Это то, что ваша структура может выглядеть в формате JSON:

["LinkLabel","This is LinkLabel's text",170,40]