Я пытаюсь записать в файл csv строка за строкой, используя язык С#. Вот моя функция
Вся функция выполняется внутри цикла, и каждая строка должна быть записана в файл csv . В моем случае следующая строка перезаписывает существующую строку, и в конце я получаю единственную запись в CSV файле, которая является последней. Как я могу записать все строки в csv файл?
14 ответов
224 Решение Johan [2013-09-12 09:47:00]
ОБНОВИТЬ
Еще в наивные времена я предлагал делать это вручную (это было простое решение простого вопроса), однако из-за того, что это становилось все более и более популярным, я бы рекомендовал использовать библиотеку CsvHelper, которая выполняет все проверки безопасности и т.д.
CSV намного сложнее, чем предполагает вопрос/ответ.
Оригинальный ответ
Поскольку у вас уже есть цикл, попробуйте сделать это следующим образом:
Или что-то на этот счет. Я рассуждаю так: вам не нужно будет писать в файл для каждого элемента, вы будете открывать поток только один раз, а затем писать в него.
Вы можете заменить
если вы хотите сохранить предыдущие версии CSV в том же файле
С# 6
Если вы используете С# 6.0, то вы можете сделать следующее
РЕДАКТИРОВАТЬ
Вот ссылка на вопрос, который объясняет, что делает Environment.NewLine
Я очень рекомендую вам пойти на более утомительный маршрут. Особенно, если размер вашего файла большой.
File.AppendAllText() открывает новый файл, записывает содержимое и закрывает файл. Открытие файлов — это очень ресурсоемкая операция, чем запись данных в открытый поток. Открытиезакрытие файла внутри цикла приведет к снижению производительности.
Подход, предложенный Йоханом, решает эту проблему, сохраняя все выходные данные в памяти и затем записывая их один раз. Однако (в случае больших файлов) программа будет потреблять большое количество оперативной памяти и даже сбой с OutOfMemoryException
Еще одно преимущество моего решения заключается в том, что вы можете реализовать приостановкувозобновление, сохраняя текущую позицию во входных данных.
обн. Размещено в нужном месте
Написание файлов csv вручную может быть затруднено, потому что ваши данные могут содержать запятые и символы новой строки. Вместо этого я предлагаю вам использовать существующую библиотеку.
В этом вопросе упоминаются несколько вариантов.
Я использую два решения синтаксического анализа, поскольку их очень легко поддерживать
Вместо этого просто используйте AppendAllText:
Единственный недостаток AppendAllText заключается в том, что он будет вызывать ошибку, если файл не существует, поэтому это нужно проверить
Извините, светлый момент перед чтением документации. В любом случае метод WriteAllText перезаписывает все, что было ранее записано в файле, если файл существует.
Обратите внимание, что ваш текущий код не использует правильные новые строки, например, в «Блокноте» вы увидите все как одну длинную строку. Измените код на это, чтобы иметь соответствующие новые строки:
6 Oliver [2013-09-12 10:09:00]
Вместо того чтобы вызывать каждый раз AppendAllText() , вы должны подумать об открытии файла один раз, а затем написать целое содержимое один раз:
TL; DR Я пытаюсь взять поток данных и заставить его записать в файл .csv. Все проработано, кроме части записи, которая, я думаю, просто из-за того, что я неправильно ссылаюсь на файл .csv. Но я новичок в этом деле и не могу понять, как правильно на него ссылаться, поэтому мне нужна помощь.
Здравствуйте, и большое спасибо заранее всем, кто может помочь мне с этим! Немного предварительной информации, моя > (ссылка для тех, кто достаточно заинтересован, чтобы посмотреть на нее), которая должна передавать значения EMG, акселерометра, гироскопа и ориентации в файл .csv. Я так близок к тому, чтобы заставить приложение работать, но мой недостаток опыта программирования наконец настиг меня, и я застрял на чем-то довольно простом. Я знаю, что приложение может передавать данные, так как я смог заставить его печатать значения EMG в области отладки. Я также могу заставить приложение открыть файл .csv, используя этот код:
Но после завершения программы никакие данные не попадают в этот файл. Единственное, что я могу подумать, может быть причиной этого является то, что функция печати неправильно ссылается на этот путь к файлу. Я бы предположил, что это простая вещь, но, как я уже сказал, я неопытный, и не знаю точно, как решить эту проблему. Я не уверен, какая другая информация необходима, поэтому я просто предоставлю все, что, по моему мнению, может быть полезным.
Это структура функции, которая должен открыть файлы: (Примечание: приложение предназначено для открытия файла в том же каталоге, что и он сам)
Это помощник для печати данных акселерометра и гироскопа (похоже, что нет ничего подобного для печати данных EMG, но я знаю, что это так, так что … Watevs):
И это структура функции, которая использует помощник:
Я разговаривал с сотрудником Thalmic Labs (парнем, который на самом деле создал приложение), и он сказал, что это звучит так: если приложение не было полностью сломано, у меня потенциально просто были проблемы с разрешениями на моем компьютере. На этом компьютере много пользователей, так что это вполне может иметь место, хотя я, конечно, надеюсь, что нет, и я все же хотел бы попытаться выяснить это еще раз, прежде чем бросать полотенце. Еще раз спасибо всем, кто может помочь!
Решение
Мое воображение подводит меня. Вы пытались писать или читать из ostringstream или istringstream объектов? Это может быть информативным. Вот правильная строка:
Обратите внимание, что C ++ не имеет встроенной поддержки потоковой передачи кода .csv, хотя, возможно, вам придется выполнять эти преобразования самостоятельно. Все может работать лучше, если вы замените символы «/» на (doubled) «//» …
Pirnazar
Well-known member
Загрузка csv файла с выводом данных в dataGridView
Сегодня хочу показать на простом примере, как выполняется загрузка и чтение CSV файла с помощью языка c#. И так, для начала создадим Windows Forms приложение, после чего поместим на форму два элемента управления: кнопку и datagridview, в который будем выводить полученные данные.
Затем создадим csv файл (cars.csv) и поместим в него 4 записи. Как Вы, наверное, знаете, формат csv подразумевает наличие некоторых правил формирования документа, так например: каждая строка заканчивается символами CLRF, а каждая запись, которая содержится в строке, запятыми.
На этом подготовительная работа закончена и теперь переходим к решению основной задачи.
И так, чтобы прочитать и загрузить CSV файл нам понадобиться метод ReadAllLines, который позволяет построчно считать данные из файла.
Строки получены и теперь нам осталось выполнить всего две задачи:
1. Разбить каждую строку массива cars на отдельные значения. Для этого воспользуемся методом Split, в качестве параметра в который передадим знак-разделитель, которым в данном примере является запятая.
2. Вывести полученные данные в окно datagridview. Для решения этой задачи создадим небольшую таблицу (DataTable), которая содержит пять колонок: фирма, название, год, максимальная скорость и цена, после чего заполним её ранее полученными одиночными значениями.
Загружаем CSV файл и выводим данные в dataGridView.
На этом всё, если есть какие-то вопросы, то оставляйте их в комментариях.