Как очистить csv файл полностью java

Обновлено: 07.07.2024

CSV означает Comma Separated Values ; это широко используемый формат для передачи больших объемов данных между системами. Также существует множество библиотек синтаксического анализатора, которые можно использовать вместе с Java, чтобы иметь возможность работать с этим форматом.

Использование PrintWriter для чтения и записи в CSV-файл на Java

Функция PrinterWriter в Java - это класс записи, используемый для печати форматированного представления объектов в поток вывода текста. Мы создаем объект writer , передавая новый файл с именем test.csv в качестве места назначения для писателя. Здесь объект sb добавляет указанную строку к последовательности символов.

Метод write() экземпляра writer записывает текстовое содержимое в поток. Метод flush() сбрасывает содержимое в файл, а метод close() навсегда закрывает поток. Мы также можем прочитать содержимое файла test.csv .

Метод readCSVFile() вызывается на экземпляре класса TestCSV . Здесь мы создали экземпляр класса Scanner со значениями из указанного файла. Он разбивает данные на токены с использованием шаблона-разделителя. hasNextLine() возвращает истину, если у сканера есть другая строка ввода. Таким образом, мы читаем каждую строку данных токена с помощью метода next() и сохраняем ее в массиве, наконец, распечатывая результат.

Использование библиотеки OpenCSV для чтения и записи в файл CSV на Java

Зависимость maven для этой библиотеки приведена ниже:

OpenCsv - это простая библиотека синтаксического анализатора для java; у него есть набор классов OpenCsv, которые мы используем для чтения и записи в файл CSV. В методе main() мы сначала вызываем метод записи в файл CSV с помощью класса CSVWriter . Этот класс используется для записи данных CSV в реализацию записи.

Мы создаем экземпляр writer для CSVWriter и вызываем функцию writeNext() для этого объекта, чтобы сгенерировать файл CSV с данными из массива строк, разделенных с помощью разделителя. Метод close() закрывает поток записи.

Чтобы прочитать данные из файла, который мы создали в формате CSV, мы вызываем метод readCSVFile для объекта основного класса, где мы анализируем файл CSV. Чтобы прочитать сразу все записи в Список, воспользуемся методом readAll() . Мы перебираем каждую запись и распечатываем ее.

Сопутствующая статья - Java String

Узнайте различные способы удаления содержимого файла без удаления файла.

1. Введение

В этом учебнике Мы увидим, как мы используем Java для удаления содержимого файла без удаления самого файла. Поскольку есть много простых способов сделать это, давайте рассмотрим каждый по одному.

2. Использование PrintWriter

Ява РаспечататьПисач класс расширяет Писатель класс. Он печатает отформатированную представление объектов в потоке текстового вывода.

Мы выполнить простой тест. Давайте создадим РаспечататьПисач например, указывая на существующий файл, удаляя существующее содержимое файла, просто закрывая его, а затем убедитесь, что длина файла пуста:

Кроме того, обратите внимание, что если нам не нужна РаспечататьПисач объект для дальнейшей обработки, это лучший вариант. Однако, если нам нужна РаспечататьПисач объект для дальнейших операций файла, мы можем сделать это по-другому:

3. Использование Файлрайтер

Ява ФайлРайтер является стандартным классом Java IO API, который предоставляет методы записи данных, ориентированных на характер, в файл.

Давайте теперь посмотрим, как мы можем сделать ту же операцию с помощью ФайлРайтер:

Точно так же, если нам нужна ФайлРайтер объект для дальнейшей обработки, мы можем назначить его переменной и обновить с пустой строкой.

4. Использование FileOutputStream

FileOutputStream Java — это выходной поток, используемый для записи данных byte в файл.

Теперь давайте удалим содержимое файла с помощью FileOutputStream:

5. Использование Apache Commons IO FileUtils

Чтобы увидеть, как это работает, давайте добавим ИО- Apache Commons зависимость от нашей пом.xml :

После этого возьмем быстрый пример, демонстрирующий удаление содержимого файла:

6. Использование файлов Java NIO

Мы также можем удалить содержимое файла с помощью java.nio.file.Files :

7. Использование Java NIO FileChannel

Java NIO FileChannel — это реализация NIO для подключения файла. Он также дополняет стандартный пакет Java IO.

8. Использование Гуавы

Guava — это библиотека с открытым исходным кодом на основе Java, которая предоставляет полезные методы для ведения операций в i/O. Давайте посмотрим, как использовать API Guava для удаления содержимого файла.

Во-первых, мы должны добавить Гуава зависимости в нашей пом.xml :

После этого рассмотрим быстрый пример удаления содержимого файла с помощью Guava:

9. Заключение

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


Продукты HFLabs в промышленных объемах обрабатывают данные: адреса, ФИО, реквизиты компаний и еще вагон всего. Естественно, тестировщики ежедневно с этими данными имеют дело: обновляют тест-кейсы, изучают результаты очистки. Часто заказчики дают «живую» базу, чтобы тестировщик настроил сервис под нее.

Первое, чему мы учим новых QA — сохранять данные в первозданном виде. Все по заветам: «Не навреди». В статье я расскажу, как аккуратно работать с CSV-файлами в Excel и Open Office. Советы помогут ничего не испортить, сохранить информацию после редактирования и в целом чувствовать себя увереннее.

Материал базовый, профессионалы совершенно точно заскучают.

Что такое CSV-файлы

Формат CSV используют, чтобы хранить таблицы в текстовых файлах. Данные очень часто упаковывают именно в таблицы, поэтому CSV-файлы очень популярны.



CSV-файл состоит из строк с данными и разделителей, которые обозначают границы столбцов

CSV расшифровывается как comma-separated values — «значения, разделенные запятыми». Но пусть название вас не обманет: разделителями столбцов в CSV-файле могут служить и точки с запятой, и знаки табуляции. Это все равно будет CSV-файл.

У CSV куча плюсов перед тем же форматом Excel: текстовые файлы просты как пуговица, открываются быстро, читаются на любом устройстве и в любой среде без дополнительных инструментов.

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

Одна беда — текстового редактора для работы с CSV мало. Еще ничего, если таблица простая: в первом поле ID одной длины, во втором дата одного формата, а в третьем какой-нибудь адрес. Но когда поля разной длины и их больше трех, начинаются мучения.



Следить за разделителями и столбцами — глаза сломаешь

Еще хуже с анализом данных — попробуй «Блокнотом» хотя бы сложить все числа в столбце. Я уж не говорю о красивых графиках.

Поэтому CSV-файлы анализируют и редактируют в Excel и аналогах: Open Office, LibreOffice и прочих.

Ветеранам, которые все же дочитали: ребята, мы знаем об анализе непосредственно в БД c помощью SQL, знаем о Tableau и Talend Open Studio. Это статья для начинающих, а на базовом уровне и небольшом объеме данных Excel с аналогами хватает.

Как Excel портит данные: из классики

Все бы ничего, но Excel, едва открыв CSV-файл, начинает свои лукавые выкрутасы. Он без спроса меняет данные так, что те приходят в негодность. Причем делает это совершенно незаметно. Из-за этого в свое время мы схватили ворох проблем.

Большинство казусов связано с тем, что программа без спроса преобразует строки с набором цифр в числа.

Округляет. Например, в исходной ячейке два телефона хранятся через запятую без пробелов: «5235834,5235835». Что сделает Excel? Лихо превратит номера́ в одно число и округлит до двух цифр после запятой: «5235834,52». Так мы потеряем второй телефон.

Приводит к экспоненциальной форме. Excel заботливо преобразует «123456789012345» в число «1,2E+15». Исходное значение потеряем напрочь.

Проблема актуальна для длинных, символов по пятнадцать, цифровых строк. Например, КЛАДР-кодов (это такой государственный идентификатор адресного объекта: го́рода, у́лицы, до́ма).

Потеря плюса критична, например, если данные пойдут в стороннюю систему, а та при импорте жестко проверяет формат.

Разбивает по три цифры. Цифровую строку длиннее трех символов Excel, добрая душа, аккуратно разберет. Например, «8 495 5235834» превратит в «84 955 235 834».

Форматирование важно как минимум для телефонных номеров: пробелы отделяют коды страны и города от остального номера и друг от друга. Excel запросто нарушает правильное членение телефона.

Удаляет лидирующие нули. Строку «00523446» Excel превратит в «523446».
А в ИНН, например, первые две цифры — это код региона. Для Республики Алтай он начинается с нуля — «04». Без нуля смысл номера исказится, а проверку формата ИНН вообще не пройдет.

Меняет даты под локальные настройки. Excel с удовольствием исправит номер дома «1/2» на «01.фев». Потому что Windows подсказал, что в таком виде вам удобнее считывать даты.

Побеждаем порчу данных правильным импортом

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

По умолчанию Excel применяет к данным в загруженном CSV-файле тип «General» — общий. Из-за него программа распознает цифровые строки как числа. Такой порядок можно победить, используя встроенный инструмент импорта.

Запускаю встроенный в Excel механизм импорта. В меню это «Data → Get External Data → From Text».

Выбираю CSV-файл с данными, открывается диалог. В диалоге кликаю на тип файла Delimited (с разделителями). Кодировка — та, что в файле, обычно определяется автоматом. Если первая строка файла — шапка, отмечаю «My Data Has Headers».

Перехожу ко второму шагу диалога. Выбираю разделитель полей (обычно это точка с запятой — semicolon). Отключаю «Treat consecutive delimiters as one», а «Text qualifier» выставляю в «». (Text qualifier — это символ начала и конца текста. Если разделитель в CSV — запятая, то text qualifier нужен, чтобы отличать запятые внутри текста от запятых-разделителей.)

На третьем шаге выбираю формат полей, ради него все и затевалось. Для всех столбцов выставляю тип «Text». Кстати, если кликнуть на первую колонку, зажать шифт и кликнуть на последнюю, выделятся сразу все столбцы. Удобно.

Дальше Excel спросит, куда вставлять данные из CSV — можно просто нажать «OK», и данные появятся в открытом листе.


Перед импортом придется создать в Excel новый workbook

Но! Если я планирую добавлять данные в CSV через Excel, придется сделать еще кое-что.

После импорта нужно принудительно привести все-все ячейки на листе к формату «Text». Иначе новые поля приобретут все тот же тип «General».

  • Нажимаю два раза Ctrl+A, Excel выбирает все ячейки на листе;
  • кликаю правой кнопкой мыши;
  • выбираю в контекстном меню «Format Cells»;
  • в открывшемся диалоге выбираю слева тип данных «Text».

Чтобы выделить все ячейки, нужно нажать Ctrl+A два раза. Именно два, это не шутка, попробуйте

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

Альтернатива: Open Office Calc

Для работы с CSV-файлами я использую именно Calc. Он не то чтобы совсем не считает цифровые данные строками, но хотя бы не применяет к ним переформатирование в соответствии с региональными настройками Windows. Да и импорт попроще.

Конечно, понадобится пакет Open Office (OO). При установке он предложит переназначить на себя файлы MS Office. Не рекомендую: хоть OO достаточно функционален, он не до конца понимает хитрое микрософтовское форматирование документов.

А вот назначить OO программой по умолчанию для CSV-файлов — вполне разумно. Сделать это можно после установки пакета.

Итак, запускаем импорт данных из CSV. После двойного клика на файле Open Office показывает диалог.



Заметьте, в OO не нужно создавать новый воркбук и принудительно запускать импорт, все само

  1. Кодировка — как в файле.
  2. «Разделитель» — точка с запятой. Естественно, если в файле разделителем выступает именно она.
  3. «Разделитель текста» — пустой (все то же, что в Excel).
  4. В разделе «Поля» кликаю в левый-верхний квадрат таблицы, подсвечиваются все колонки. Указываю тип «Текст».

Помимо Calc у нас в HFLabs популярен libreOffice, особенно под «Линуксом». И то, и другое для CSV применяют активнее, чем Excel.

Бонус-трек: проблемы при сохранении из Calc в .xlsx

Если сохраняете данные из Calc в экселевский формат .xlsx, имейте в виду — OO порой необъяснимо и масштабно теряет данные.


Белая пустошь, раскинувшаяся посередине, в оригинальном CSV-файле богато заполнена данными

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

Если что-то потерялись, лечение — пересохранить из CSV в .xlsx. Или, если установлен Windows, импортнуть из CSV в Excel и сохранить оттуда.

После пересохранения обязательно еще раз проверяю, что все данные на месте и нет лишних пустых строк.

Если интересно работать с данными, посмотрите на наши вакансии. HFLabs почти всегда нужны аналитики, тестировщики, инженеры по внедрению, разработчики. Данными обеспечим так, что мало не покажется :)

Решил сделать свой вклад в мировое open-source сообщество. Как вы уже догадались из названия статьи, на этот раз речь пойдет о формате CSV и о работе с CSV в Java.

Итак, проблема заключалась в том, что генерация отчетов в формате Excel через библиотеку POI кушала много оперативной памяти и процессорного времени. Сам по себе Excel, наверное, один из немногих действительно хороших продуктов компании Microsoft, но вот формат файлов оставляет желать лучшего. Короче говоря, при генерации документа необходимо полностью держать его в памяти.

Выходом из ситуации является использование формата CSV (comma-separated values file format), который к счастью тоже читается с помощью Excel.

Пока что не существует строго описанной спецификации CSV формата. Поэтому для создания удобной библиотеки на Java пришлось порыться в интернете. Вот список ресурсов, которые я анализировал:

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

Все различия между Excel CSV и Pure CSV вынесены в удобно конфигурируемые свойства:

  • delimiter - разделитель, по умолчанию - ";"
  • preserveSpaces - сохранять ли пробелы при чтении, по умолчанию - "true"
  • ignoreEmptyLines - игнорировать ли пустые линии (то есть те, в которых нет значений и разделителей), по умолчанию - "false"
  • ignoreComments - игнорировать ли комментарии, по умолчанию - "false"

Изначально, конечно же, очень хотелось наворотить библиотеку всякими "полезными" функциями: например, поддержкой заголовков, Unix-подобным эскейпингом и т.д.. Но разум взял верх и получилась, на мой взгляд, вполне хорошая библиотека без лишнего мусора.

Ниже представлены примеры кода на Java с использованием библиотеки.

Для создания и записи в CSV файл:

В результате выполнения этого кода будет сгенерирован следующий файл:

А это вариант для чтения данных из CSV (предположим, что мы читаем файл сгенерированный в предыдущем примере):

Результат будет таким:

Для более изощренных вариантов использования посмотрите файл CsvTestCase из папки src библиотеки. В jar этот тест кейс я не вносил, чтобы не создавать лишние dependency на библиотеку.

Updated (07.04.2008): Смешно, конечно, но уже 3-ий раз меняю логику обработки исключений в библиотеке, а точнее имена и иерархию исключений. При этом остальной код остался без изменений.


Заметка
Прочитайте этот документ RFC4180 для формата значений, разделенных запятыми (CSV).

В файле CSV обычно есть две проблемы:

1. Поле, содержащее разделитель, например, разделитель является запятой, а поле, содержащее запятые:

2. Двойные кавычки используются для включения полей и поля, содержащего двойные кавычки. Чтобы решить эту проблему, двойная кавычка, появляющаяся внутри поля, должна быть экранирована, предшествуя другой двойной кавычке ( RFC4180 )

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

  1. Простое решение для анализа простого отформатированного файла CSV.
  2. Расширенное решение для анализа странного отформатированного файла CSV (поле, содержащее разделитель или двойные кавычки)
  3. Стороннее решение, пример OpenCSV.

1. Простое решение

Если вы уверены, что файлы CSV не содержат «разделитель или двойные кавычки», просто используйте стандартный split() проанализировать файл CSV.

1.1 Просмотрите простой файл CSV

1.2 Никакой магии, просто прочитайте текстовый файл выше и разделите его запятыми.

1.3 Для JDK 7 и выше используются try-ресурсы.

2. Предварительное решение

Это решение решит проблему с полем, содержащим разделитель или двойные кавычки, а также поддержит пользовательский разделитель и пользовательское закрытое поле. Просмотрите следующий пример разбора CSV, а также тестовые примеры JUnit, чтобы понять, как это работает.

Заметка
Снова, если двойная кавычка, появляющаяся в поле, должна быть экранирована, предшествуя ему другой двойной кавычкой, например

2.1 Просмотрите другой файл CSV

3.3 Просмотрите следующий модульный тест, он проверяет проблему «запятые и двойные кавычки».

3.4 Просмотрите другой модульный тест, он протестирует пользовательский разделитель и пользовательское поле.

3. Пример OpenCSV

3.2 Просмотр файла CSV.

3.2 Пример OpenCSV для разбора файла CSV.

Заметка
Пожалуйста, обратитесь к этой официальной документации OpenCSV для большего количества примеров.

Читайте также: