Файлы значений, разделенные запятыми (чтение / запись) - C # - PullRequest
3 голосов
/ 03 октября 2009

Несколько лет я очень интересовался файлами CSV, но мне до сих пор не приходилось их использовать, поэтому я довольно новичок в этом.

У меня есть приложение, которое хранит информацию об элементах управления, которые были созданы пользователем во время выполнения. Я планирую использовать файлы 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

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

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

Спасибо, Джейсон.

Ответы [ 6 ]

3 голосов
/ 03 октября 2009

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

Здесь вы можете увидеть, как другие реализовали подобную функцию.

3 голосов
/ 03 октября 2009

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

2 голосов
/ 03 октября 2009

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

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

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

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

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

["LinkLabel","This is LinkLabel's text",170,40]
2 голосов
/ 03 октября 2009

Интересно, не сделает ли 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 голосов
/ 03 октября 2009

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

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

  • Значения могут содержать разрывы строк, поэтому вы не можете прочитать файл построчно.
  • Некоторые файлы вообще не разделяются запятой, а разделяются точкой с запятой.
  • Некоторые файлы имеют неровные длины строк, то есть строки с различным количеством элементов.
  • Поскольку не существует правил для того, как значения должны быть заключены в кавычки и экранированы, сложно написать синтаксический анализатор, который может обрабатывать его иначе.
0 голосов
/ 03 октября 2009

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

Google и прочитайте некоторые образцы.

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...