Js прочитать csv файл

Обновлено: 05.07.2024

Заголовок1, Заголовок 2, heading3, heading4, heading5, value1_1, value2_1, value3_1, value4_1, value5_1, value1_2, value2_2, value3_2, value4_2, value5_2.

Как вы читаете эти данные и конвертируете их в такой массив, используя Javascript?:

[рубрика1: значение1_1, заголовок2: значение2_1, заголовок3: значение3_1, заголовок4: value4_1, heading5: value5_1], [heading1: value1_2, heading2: value2_2, heading3: value3_2, heading4: value4_2, heading5: value5_2].

Я пробовал этот код, но не повезло!:

ПРИМЕЧАНИЕ. Я придумал это решение, прежде чем мне напомнили обо всех "особых случаях", которые могут возникать в действительном файле CSV, например, в экранированных кавычках. Я оставляю свой ответ тем, кто хочет что-то быстро и грязно, но я рекомендую Evan answer для точности.

Этот код будет работать, если ваш файл data.txt представляет собой одну длинную строку разделенных запятыми записей без новых строк:

Следующий код будет работать с "истинным" CSV файлом с разрывами строк между каждым набором записей:

Не нужно писать свои собственные.

Библиотека jQuery-CSV имеет функцию $.csv.toObjects(csv) , которая автоматически выполняет сопоставление.

Примечание. Библиотека предназначена для обработки любых CSV-данных, которые RFC 4180 совместимы, включая все неприятные случаи кросс, которые наиболее "простые" 'решения не видят.

Как уже говорилось в @Blazemonger, сначала вам нужно добавить разрывы строк, чтобы данные были достоверными CSV.

Используя следующий набор данных:

Используйте код:

Выход, сохраненный в 'data', будет выглядеть следующим образом:

Примечание. Технически, способ, которым вы написали сопоставление значения ключа, является недопустимым JavaScript. Объекты, содержащие пары ключ-значение, должны быть заключены в скобки.

Если вы хотите попробовать это для себя, я предлагаю вам взглянуть на демонстрацию основного использования в разделе 'toObjects()' вкладка.

Отказ от ответственности: я являюсь оригинальным автором jQuery-CSV.

Update:

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

Update2:

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

(Обновление:). В Papa Parse 4 тот же файл занимает около 30 секунд в Firefox. Теперь Papa Parse 4 наиболее быстрый CSV-анализатор для браузера.)

Анализ текста очень прост:

Разбор файлов также прост:

Потоковые файлы похожи (здесь пример, который передает удаленный файл):

Если ваша веб-страница блокируется во время разбора, Papa может использовать веб-работников, чтобы ваш веб-сайт реагировал.

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

Заголовок1, Заголовок 2, heading3, heading4, heading5, value1_1, value2_1, value3_1, value4_1, value5_1, value1_2, value2_2, value3_2, value4_2, value5_2 .

Как вы читаете эти данные и конвертируете в массив, подобный этому, используя Javascript ?:

[заголовок1: значение1_1, заголовок2: значение2_1, заголовок3: значение3_1, заголовок4: значение4_1, заголовок5: значение5_1], [заголовок1: значение1_2, заголовок2: значение2_2, заголовок3: значение3_2, заголовок4: значение4_2, заголовок 5: значение5_2] .

Я пробовал этот код, но не повезло!

Без разрывов строк в вашем CSV-файле любой код JavaScript не сможет узнать, где останавливается один массив (или объект), а начинается другой (если вы заранее не знаете, что всегда есть ровно пять заголовков). Был ли это недосмотр? Следующий вопрос: разрешен ли jQuery в решении? Вы использовали тег, но ваш пример кода - чистый JavaScript.

ПРИМЕЧАНИЕ. Я придумал это решение, прежде чем мне напомнили обо всех «особых случаях», которые могут возникнуть в действительном файле CSV, например, экранированные кавычки. Я оставляю свой ответ тем, кто хочет чего-то быстрого и грязного, но я рекомендую ответ Эвана для точности.

Этот код будет работать, когда ваш data.txt файл представляет собой одну длинную строку записей, разделенных запятыми, без перевода строки:

Следующий код будет работать с «истинным» CSV-файлом с разрывами строк между каждым набором записей:

Кстати, это предполагает, что файл CSV на самом деле имеет несколько строк - это то, что allText.split(/\r\n|\n/) разделяет. Если все ваши данные на самом деле представляют собой одну длинную строку данных, разделенных запятыми, без перевода строки, это не настоящий файл CSV. Привет, я использую этот код: но нет вывода. Просто пустое предупреждение отображается. мой файл выглядит так: заголовок1, заголовок2, заголовок3, заголовок4, заголовок5, значение1_1, значение2_1, значение3_1, значение4_1, значение5_1, значение1_2, значение2_2, значение3_2, значение4_2, значение5_2 Оба файла csv.html и data.txt находятся в одной папке Если это неправильный файл (или данные), то как должен выглядеть мой файл? Код может не обрабатывать все допустимые стандартные CSV-файлы IETF и может завершиться ошибкой, если есть строки со встроенными запятыми, переносами строк или двойными кавычками. Например, 1, "IETF allows ""quotes"", commas and \nline breaks" это разрешено, поскольку строка окружена двойными кавычками, а двойные кавычки экранированы. Я пытался прочитать файл .csv с Mac. Мне удалось заставить этот скрипт распознавать символы новой строки только после того, как я изменил первый сплит на этот. var allTextLines = allText.split("\r"); После этого он работал отлично! Спасибо!

Не нужно писать свой собственный .

В библиотеке jQuery-CSV есть функция, $.csv.toObjects(csv) которая выполняет сопоставление автоматически.

Примечание. Библиотека предназначена для обработки любых данных CSV, совместимых с RFC 4180 , включая все неприятные крайние случаи, которые игнорируются большинством «простых» решений.

Как уже говорилось в @Blazemonger, сначала нужно добавить разрывы строк, чтобы сделать данные действительными CSV.

Используя следующий набор данных:

Используйте код:

Вывод, сохраненный в «data», будет:

Примечание. Технически способ написания сопоставления ключ-значение недопустим в JavaScript. Объекты, содержащие пары ключ-значение, должны быть заключены в квадратные скобки.

Если вы хотите попробовать это сами, я предлагаю вам взглянуть на демонстрацию базового использования на вкладке toObjects ().

Отказ от ответственности: я оригинальный автор jQuery-CSV.

Обновить:

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

Update2:

IOW, «toObject» это или можно думать как «toJSON», нет? И является ли двоеточие после вызова toObjects (csv) опечаткой? IOW, это не точка с запятой? Фантастическая библиотека. К сведению, csv переданный параметр является строкой csv - считайте файл csv как текст, чтобы получить строку csv. @Evan Plaice Как использовать эту библиотеку для чтения из файла CSV? @RichaSinha Чтение файла в виде текстового буфера с помощью API-файла HTML5 или AJAX. Затем передайте строковый буфер в парсер. В результате получится массив данных. Смотрите страницу проекта для примеров.

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

Этот вопрос старый, но я считаю, что теперь есть лучшее решение, когда доступен Papa Parse . Это библиотека, которую я написал с помощью авторов, которая анализирует текст или файлы CSV. Это единственная из известных мне JS-библиотек, которая поддерживает файлы размером в гигабайты. Он также корректно обрабатывает некорректный ввод.

Разобрали 1 ГБ файл за 1 минуту

1 ГБ файл анализируется за 1 минуту:

( Обновление: в Papa Parse 4 этот же файл занимал всего около 30 секунд в Firefox. Papa Parse 4 теперь является самым быстрым из известных анализаторов CSV для браузера.)

Парсинг текста очень прост:

Парсинг файлов также прост:

Потоковые файлы похожи (вот пример потокового удаленного файла):

Если ваша веб-страница блокируется во время синтаксического анализа, Papa может использовать веб-работников, чтобы ваш веб-сайт реагировал.

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

Итак, в предыдущем уроке мы изучили как читать файлы — как выводить в консоль их содержимое, и даже записали несколько файлов. Настало время овладеть еще двумя кейсами — работой с JSON файлами в node.js и работой с CSV.

Записываем json файл в node.js

Здесь все довольно просто. Вот таким кодом мы делали запись:

Ок. Что будет если мы попытаемся записать json файл?

Давайте возьмем для примера массив man:

Преобразуем в json строку и запишем тем же методом, что и раньше.

валидируем. Работает! Мы получили валидный json файл из массива с помощью node.js. Давайте теперь попробуем решить обратную задачу — как считать содержимое файла json в переменную. Это один из наиболее часто задаваемых вопросов при работе в javascript. Как только не мучаются фронтенд разработчики — все получается не очень, а все просто — чтение файлов прерогатива бекенда, итак, поехали.

Читаем файл json в node.js

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

Теперь в нужном месте файла, там где мы хотим получить содержимое json напишем:

и мы получаем вывод:

Если мы выведим тип полученных данных console.log(typeof jsonData), то увидим - object т.е. нам не нужно проводить дополнительных преобразований. Итак, прочитать файл json в node.js и получить его в переменную — одна строка.

Несколько слов о require – это команда, которая позволяет подключать модули в node.js. Причем как встроенные, так и самописные, или установленные. Мы уже применяли данную команду для подключения модуля:

файловой системы и для путей. Теперь — мы просто применили данную команду для подключения json файла.

Итак, мы овладели первым кейсом, теперь переходим ко второму — запись и чтение CSV файлов.

Чтение CSV в node.js

Несколько слов о нудной теории — CSV это формат текстового файла, который позволяет хранить структурированные значения в формате строк и колонок, а данные отделены определенным символом. Я специально не упоминаю comma – разделитель запятую, поскольку формат позволяет разделять данные пробелом, точкой с запятой или табуляцией.

Мы будем для чтения CSV использовать сторонний модуль. Да, можно и самому написать код, но идеология ноды — пакеты. Поэтому начнем. Для начала установим csv-parser.

Обратите внимание, после выполнения команды у нас появилась папка node_modules где установлен csv-parser и необходимые зависимости. Да, иногда для одной операции в одну строку можно натянуть себе мегабайты пакетов.

После установки пакет нужно подключить. Надеюсь не забыли комментировать предыдущий код?

И мы получаем в переменной result массив из файла table.csv.

Итак, плюс один кейс.

Запись CSV файла

Как вы уже поняли, мощь node.js заключена в модулях. Установим модуль csv-writer:

И подключим его в коде:

Записывать чуть сложнее чем читать — для начала выполняем конфигурацию модуля.

Теперь давайте попробуем запись подобный файл. Как и в самом первом примере — создадим массив:

ну и отдадим команду записи:

результат — появление файла out.csv, открыв который увидим ожидаемую структуру. Остается проверить — открыть любым табличным редактором и убедиться что все работает.

Итак, мы овладели 4 основными кейсами работы с файлами — чтением и записью CSV и JSON файлов в Node.js.

Домашнее задание

Загрузка ДЗ на проверку возможна только после приобретения курса.

Создайте функцию f1, которая при запуске из массива ar1 создаем файл ar1.json в текущей папке.

Напоминаю - больше данных по задаче, правильное написание и логика - в шаблоне. Сдаем на проверку - только app.js

Создайте функцию f2, которая при запуске из массива ar2 создаем файл ar2.json в текущей папке.

Создайте функцию f3, которая при запуске выводит содержимое файла j3.json в консоль.

Исследование различных веб-технологий, математических алгоритмов и проектирование веб-приложений.

Рубрики

Комменты

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

Структура формата CSV

Такой файл легко открывается в Excel(или в OpenOffice) и все значения находятся в своих ячейках таблицы.

iMacros Excel

Аналогично вы можете взять любую экселевскую таблицу(с расширениями .xls или .xlsx) и сохранить ее в формат CSV. Это очень простой формат и он не поддерживает формулы, вычисления и т.д., как полноценные форматы Excel. Однако, бывает очень удобно записывать данные из iMacros и потом обрабатывать их в Excel и, наоборот, брать информацию из Excel и использовать ее в своих скриптах.

Примечание: на самом деле у Excel есть еще XML-формат, который поддерживает формулы, стили оформления и большую часть функционала Excel, он текстовый, а не бинарный, как .xls или .xlsx. Тем не менее, он куда более сложный, нежели CSV и требует более глубоко понимания и навыков в кодинге. Мне доводилось генерировать при помощи JS вывод отчетов с перекрестными формулами в Excel, задача достаточно трудоемкая и времязатратная.

Чтение формата CSV и получение любой ячейки таблицы с помощью iMacros и Javascript

В первом и в прошлом уроках я ругал стандартные возможности iMacros по работе с таблицами. Я понимаю, что они добавили !DATASOURCE и прочую нечисть, с крайне урезанным функционалом для простых пользователей, чтобы сделать жизнь обывателя проще. Но, получилось совсем наоборот. Не стоит отчаиваться, сегодня я с вами поделюсь своим решением, которое позволит вам манипулировать таблицами, как вам вздумается.

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

Замечательно! Мы получим содержимое файла в виде текста. Это не очень удобно, поэтому преобразуем его в двумерный Javascript-массив.

Вот такой массив я хочу видеть в результате:

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

Парсинг формата CSV

На первый взгляд может показаться, что мы можем тупо использовать 2 раза метод split(), поскольку текст мы можем разбить на массив строк при помощи split('\r\n') , а строку на ячейки при помощи split(',') , поскольку в качестве разделителя у нас используется запятая. Это не совсем так, если у нас в некоторых ячейках будет текст, содержащий в себе запятые, наш алгоритм будет работать неправильно.

Давайте добавим немного запятых в исходные данные(test.csv):

На самом деле ситуаций, когда такой подход со split() не сработает, может быть великое множество, тут и кавычки разных видов, и экранированные символы и т.д. На помощь нам придет один очень популярный скрипт для парсинга CSV в массив.

Итоговый скрипт чтения и парсинга файла формата CSV для iMacros+JS:

В консоли мы видим аккуратно распарсенный массив с нашей таблицей.


Сохранение двумерного Javascript-массива в CSV в iMacros

Считывать содержимое csv-файлов мы научились. Отсюда возникает вопрос, а как же выполнить обратное преобразование массива в текст? На самом деле, тут нету ничего сложного.

Давайте воспользуемся следующей функцией:

Важное примечание: CSV-файлы необязательно должны использовать запятую в качестве разделителя, в большей части мира используется точка с запятой(;).
Excel 2016 корректно работает с вашими региональными настройками и использует тот разделитель, который указан в панели управления в Настройках региона->Дополнительные параметры->Разделитель элементов списков . В Excel 2010 на английской винде, у меня по умолчанию стояла запятая в качестве разделителя, вы его можете поменять. Поэтому, если вдруг вы сгенерировали CSV-файл, а он у вас в Excel открылся в одной ячейке, первым делом проверьте какие разделители вы используете и какие по умолчанию использует ваша операционная система.

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