Я пытаюсь записать в csv
файл строка за строкой, используя язык C #. Вот моя функция
string first = reader[0].ToString();
string second=image.ToString();
string csv = string.Format("{0},{1}\n", first, second);
File.WriteAllText(filePath, csv);
Вся функция выполняется внутри цикла, и каждая строка должна быть записана в csv
файл. В моем случае следующая строка перезаписывает существующую строку, и в конце я получаю единственную запись в CSV-файле, которая является последней. Как я могу написать все строки в csv
файле?
StringBuilder
а затем сделать один сохранить?Util.WriteCsv (mydatacollection, @"c:\temp\data.csv");
Ответы:
ОБНОВИТЬ
Еще в наивные времена я предлагал делать это вручную (это было простое решение простого вопроса), однако из-за того, что это становилось все более и более популярным, я бы рекомендовал использовать библиотеку CsvHelper, которая выполняет все проверки безопасности и т. Д.
CSV намного сложнее, чем предполагает вопрос / ответ.
Оригинальный ответ
Поскольку у вас уже есть цикл, попробуйте сделать это следующим образом:
Или что-то на этот счет. Я рассуждаю так: вам не нужно будет писать в файл для каждого элемента, вы будете открывать поток только один раз, а затем писать в него.
Вы можете заменить
с участием
если вы хотите сохранить предыдущие версии CSV в том же файле
C # 6
Если вы используете c # 6.0, то вы можете сделать следующее
РЕДАКТИРОВАТЬ
Вот ссылка на вопрос, который объясняет, что
Environment.NewLine
делает.источник
{2}
иEnvironment.NewLine
использоватьAppendLine
вместоAppend
System.Globalization.CultureInfo.CurrentCulture.TextInfo.ListSeparator
вместо запятой.Я очень рекомендую вам пойти по более утомительному маршруту. Особенно, если ваш размер файла большой.
File.AppendAllText()
открывает новый файл, записывает содержимое и затем закрывает файл. Открытие файлов является гораздо более ресурсоемкой операцией, чем запись данных в открытый поток. Открытие \ закрытие файла внутри цикла приведет к падению производительности.Подход, предложенный Йоханом, решает эту проблему, сохраняя весь вывод в памяти, а затем записывая его один раз. Однако (в случае больших файлов) ваша программа будет потреблять большое количество оперативной памяти и даже зависать с
OutOfMemoryException
Еще одним преимуществом моего решения является то, что вы можете реализовать приостановку \ возобновление путем сохранения текущей позиции во входных данных.
UPD. Размещено с использованием в нужном месте
источник
using
заявлении. В противном случае вы будете снова и снова открывать файл снова и снова.Написание файлов CSV вручную может быть затруднено, потому что ваши данные могут содержать запятые и переводы строк. Я предлагаю вам использовать существующую библиотеку вместо.
В этом вопросе упоминается несколько вариантов.
Есть ли в C # библиотеки для чтения / записи CSV?
источник
Я использую решение двух разбора, так как это очень легко поддерживать
источник
File.AppendAllLines(filePath, lines, Encoding.ASCII);
вместоFile.WriteAllText(filePath, csv.ToString());
Итак, я делаю что-то очень неуклюжее. После построения csv с использованием StringBuilder я преобразую его в List <string>, чтобы получить IEnumerable для вызова AppendAllLines, который не будет принимать csv.ToString () в качестве параметра:List<string> lines = new List<string>(); lines.Add(csv.ToString(0, csv.Length));
у вас есть лучший способ сделать это?Вместо того, чтобы звонить каждый раз,
AppendAllText()
вы можете подумать об открытии файла один раз, а затем написать весь контент один раз:источник
Просто используйте AppendAllText вместо:
Единственным недостатком AppendAllText является то, что он будет выдавать ошибку, когда файл не существует, поэтому это необходимо проверитьИзвините, блондин за минуту до прочтения документации . В любом случае, метод WriteAllText перезаписывает все, что было ранее записано в файл, если файл существует.
Обратите внимание, что ваш текущий код не использует правильные новые строки, например, в Блокноте вы увидите все это как одну длинную строку. Измените код на это, чтобы иметь правильные новые строки:
источник
Вместо того, чтобы изобретать велосипед, можно использовать библиотеку.
CsvHelper
отлично подходит для создания и чтения CSV-файлов. Это операции чтения и записи, основанные на потоке, и, следовательно, также поддерживают операции с большим объемом данных.Вы можете написать свой CSV, как показано ниже.
Поскольку библиотека использует отражение, она будет принимать любой тип и анализировать его напрямую.
Если вы хотите узнать больше о конфигурации и возможностях библиотек, вы можете сделать это здесь .
источник
источник
.Replace(",", ";") + ','
?Обработка запятых
Для обработки запятых внутри значений при использовании
string.Format(...)
, мне помогло следующее:Чтобы объединить это с ответом Йохана, это выглядело бы так:
Возвращение файла CSV
Если вы просто хотели вернуть файл вместо того, чтобы записать его в какое-либо место, это пример того, как я это сделал:
Из хранимой процедуры
Из списка
Надеюсь, это полезно.
источник
Это простое руководство по созданию CSV-файлов с использованием C #, которое вы сможете редактировать и расширять в соответствии со своими потребностями.
Сначала вам нужно создать новое консольное приложение Visual Studio C #, для этого необходимо выполнить следующие шаги.
Пример кода создаст CSV-файл с именем MyTest.csv в указанном вами месте. Содержимое файла должно состоять из 3 именованных столбцов с текстом в первых 3 строках.
https://tidbytez.com/2018/02/06/how-to-create-a-csv-file-with-c/
источник
Возможно, вам просто нужно добавить перевод строки
"\n\r"
.источник
Вот еще одна библиотека с открытым исходным кодом для создания файла CSV легко, Cinchoo ETL
Для получения дополнительной информации, пожалуйста, прочитайте статью об использовании CodeProject .
источник
Один простой способ избавиться от проблемы с перезаписью -
File.AppendText
добавить строку в конце файла какисточник
string string_value = string.Empty;
источник
Это должно позволить вам написать файл CSV довольно просто. Использование:
источник