Запись файла CSV в .NET

Найденный изящным решением:

int pageCount = (records + recordsPerPage - 1) / recordsPerPage;

Источник: Преобразование чисел, Roland Backhouse, 2001

42
задан Russell 3 March 2010 в 00:14
поделиться

10 ответов

Если в вашей ячейке есть запятые, заключите всю ячейку в двойные кавычки, например:

cell 1,cell 2,"This is one cell, even with a comma",cell4,etc

А если вы хотите буквальную двойную кавычку, сделайте две из них, например:

cell 1,cell 2,"This is my cell and it has ""quotes"" in it",cell 4,etc

Что касается дат, придерживайтесь формата ISO, и все будет в порядке (например, гггг-мм-дд чч: мм: сс)

21
ответ дан 26 November 2019 в 23:29
поделиться

Я широко использовал файловые помощники , и это довольно здорово для создания файлов CSV.

6
ответ дан 26 November 2019 в 23:29
поделиться

Технические характеристики см. http://en.wikipedia.org/wiki/Comma-separated_values ​​

3
ответ дан 26 November 2019 в 23:29
поделиться

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

Может быть, в вашем конкретном случае не так уж сложно написать экспортер, но самое приятное в этой библиотеке то, что она двунаправленная. Если вам придется использовать CSV в будущем, это не так уж и много лишнего кода и / или дает вам согласованную библиотеку для использования в будущих проектах.

3
ответ дан 26 November 2019 в 23:29
поделиться

ODBC можно использовать для чтения и записи файлов CSV (через OdbcConnection и подходящую строку подключения). Это должно быть достаточно хорошо для создания файлов CSV и позволит вам обрабатывать такие вещи, как цитирование; однако я столкнулся с некоторыми проблемами при использовании его для чтения файлов CSV, созданных другими программами.

2
ответ дан 26 November 2019 в 23:29
поделиться

Еще одно правило, которое можно добавить к остальным: используйте запятые как разделители полей, а не как ограничители полей. Причина в том, что конечная запятая в конце строки может быть неоднозначной: не имеет ли она никакого значения или означает ли она значение NULL после нее?

2
ответ дан 26 November 2019 в 23:29
поделиться

Я нашел эту важную ссылку, которая довольно удобна. Еще не пробовал, дам знать, как это происходит!

http://www.codeproject.com/KB/linq/LINQtoCSV.aspx

Если присмотреться, то эта реализация по сути тоже использует только базовые правила. :

специальные символы = \ n \ "и разделитель char.

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

По сути, правила, упомянутые Крисом. Я думаю, что самый простой способ сделать это - создать свой вспомогательный метод, основанный на простых правилах, и изменять его по мере необходимости.

0
ответ дан 26 November 2019 в 23:29
поделиться

CsvHelper (поддерживаемая мной библиотека) также доступна через NuGet.

CsvHelper может автоматически записывать объекты вашего класса в файл.

var myObj = new MyCustomClass
{
    Prop1 = "one",
    Prop2 = 2
};
var streamWriter = // Create a writer to somewhere...
var csvWriter = new CsvWriter( streamWriter );

// You can write a single record.
csvWriter.WriteRecord( myObj );

// You can also write a collection of records.
var myRecords = new List<MyCustomClass>{ myObj };
csvWriter.WriteRecords( myRecords );
48
ответ дан 26 November 2019 в 23:29
поделиться

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

Что-то подобное должно сработать.

public class TimerPlus : IDisposable
{
    private readonly TimerCallback _realCallback;
    private readonly Timer _timer;
    private TimeSpan _period;
    private DateTime _next;

    public TimerPlus(TimerCallback callback, object state, TimeSpan dueTime, TimeSpan period)
    {
        _timer = new Timer(Callback, state, dueTime, period);
        _realCallback = callback;
        _period = period;
        _next = DateTime.Now.Add(dueTime);
    }

    private void Callback(object state)
    {
        _next = DateTime.Now.Add(_period);
        _realCallback(state);
    }

    public TimeSpan Period
    {
        get
        {
            return _period;
        }
    }

    public DateTime Next
    {
        get
        {
            return _next;
        }
    }

    public TimeSpan DueTime
    {
        get
        {
            return _next - DateTime.Now;
        }
    }

    public bool Change(TimeSpan dueTime, TimeSpan period)
    {
        _period = period;
        _next = DateTime.Now.Add(dueTime);
        return _timer.Change(dueTime, period);
    }

    public void Dispose()
    {
        _timer.Dispose();
    }
}
-121--2120569-

Я полагаю, что лучшим методом является удержание времени начала в переменной, а затем вычисление прошедшего времени как

TimeSpan t = DateTime.Now - StartTime;
-121--2120571-

Я просто хотел бы добавить RFC , который определяет формат CSV, который я бы считал каноном

18
ответ дан 26 November 2019 в 23:29
поделиться

Можете ли вы использовать массив строк, а затем объединить его, используя:

string out = "";
string[] elements = { "1", "2" };
foreach(string s in elements) { out += s + "," };
out = out.substring(0, out.Length-1);
0
ответ дан 26 November 2019 в 23:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: