Найденный изящным решением:
int pageCount = (records + recordsPerPage - 1) / recordsPerPage;
Если в вашей ячейке есть запятые, заключите всю ячейку в двойные кавычки, например:
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, и все будет в порядке (например, гггг-мм-дд чч: мм: сс)
Я широко использовал файловые помощники , и это довольно здорово для создания файлов CSV.
Технические характеристики см. http://en.wikipedia.org/wiki/Comma-separated_values
Я знаю, вы сказали, что нашли свой ответ, но Я просто хотел проголосовать за упомянутую вами библиотеку LINQtoCSV. Я использовал его в паре проектов, и он очень хорошо работает для поддержания чистоты вашего бизнес-кода и не заботится о деталях / особенностях формата файла.
Может быть, в вашем конкретном случае не так уж сложно написать экспортер, но самое приятное в этой библиотеке то, что она двунаправленная. Если вам придется использовать CSV в будущем, это не так уж и много лишнего кода и / или дает вам согласованную библиотеку для использования в будущих проектах.
ODBC можно использовать для чтения и записи файлов CSV (через OdbcConnection и подходящую строку подключения). Это должно быть достаточно хорошо для создания файлов CSV и позволит вам обрабатывать такие вещи, как цитирование; однако я столкнулся с некоторыми проблемами при использовании его для чтения файлов CSV, созданных другими программами.
Еще одно правило, которое можно добавить к остальным: используйте запятые как разделители полей, а не как ограничители полей. Причина в том, что конечная запятая в конце строки может быть неоднозначной: не имеет ли она никакого значения или означает ли она значение NULL после нее?
Я нашел эту важную ссылку, которая довольно удобна. Еще не пробовал, дам знать, как это происходит!
http://www.codeproject.com/KB/linq/LINQtoCSV.aspx
Если присмотреться, то эта реализация по сути тоже использует только базовые правила. :
специальные символы = \ n \ "и разделитель char.
если обнаружены специальные символы, заключите их в кавычки. Замените кавычки на двойные кавычки.
По сути, правила, упомянутые Крисом. Я думаю, что самый простой способ сделать это - создать свой вспомогательный метод, основанный на простых правилах, и изменять его по мере необходимости.
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 );
Встроенный таймер не предоставляет время, оставшееся до истечения. Вам нужно создать свой собственный класс, который оборачивает таймер и предоставляет эту информацию.
Что-то подобное должно сработать.
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, который я бы считал каноном
Можете ли вы использовать массив строк, а затем объединить его, используя:
string out = "";
string[] elements = { "1", "2" };
foreach(string s in elements) { out += s + "," };
out = out.substring(0, out.Length-1);