Обработка больших файлов CSV в Javascript может быть сложной задачей, особенно при работе с ограничениями памяти. Традиционно эта задача выполняется на Python и с помощью популярных библиотек, таких как pandas. Пакет npm csvtransformers упрощает работу с большими файлами CSV в Javascript, предоставляя набор простых в использовании функций, которые используют возможности Python для обработки больших наборов данных. В этой статье мы рассмотрим, как использовать csvtransformers для управления большими CSV-файлами в Javascript.

Как это работает?

csvtransformers использует python-shell для выполнения сценариев python, которые обрабатывают файлы csv с помощью pandas, dask и других мощных библиотек. За кулисами python-shell использует API-интерфейсы NodeJS spawn и child_process для создания среды для выполнения кода Python. Довольно аккуратно!

В общем, я могу изучить другие варианты использования приложений python-in-node, такие как обучение или запуск LLM!

Начиная

Чтобы использовать csvtransformers, выполните следующие действия:

1. Установите пакет csvtransformers:

npm i csvtransformers

2. Импортируйте csvtransformers в свой файл Javascript или Typescript:

import {csvtransformer} from 'csvtransformers'

or

const {csvTransformer} = require('csvtransformers')

3. Установите Python с https://www.python.org/

4. Установите необходимые библиотеки Python с помощью установщика пакетов Python (pip3):

pip3 install numpy
pip3 install pandas
pip3 install dask
pip3 install datetime
pip3 install glob

Примечание. Эта библиотека была создана на основе NodeJS 16.17.1 и Python 3.11.2.

Функции

csvtransformers предоставляет несколько функций для работы с CSV-файлами. Вот некоторые из наиболее часто используемых:

.aggregatorBool()

Эта функция создает агрегацию логических значений для заданного идентификатора и выводит результат в новые столбцы. Это полезно для агрегирования оценок «да/нет», «нравится/нет» и т. д.

.aggregatorBool(inputFile, outputFile, idCol, targetCol, newCol1, newCol2)

.агрегаторInt()

Эта функция создает агрегацию целочисленных значений для заданного идентификатора и выводит результат в новые столбцы. Это полезно для агрегирования оценок от 1 до 5 звезд.

.aggregatorInt(inputFile, outputFile, targetCol)

.binaryToBoolean()

Эта функция преобразует двоичное значение в логическое значение (0 = ложь, 1 = истина).

.binaryToBoolean(inputFile, targetCol, outputFile)

.booleanToBinary()

Эта функция преобразует логическое значение в двоичное (false = 0, true = 1).

.booleanToBinary(inputFile, targetCol, outputFile)

.обычай()

Эта функция позволяет вам запускать собственный скрипт Python.

.custom(customScript)

.генератор()

Эта функция создает новый файл CSV.

.generator(outputFile, headers, size, …valueCols)

.isoToUnix()

Эта функция изменяет значение даты и времени столбца с ISO на UNIX.

.isoToUnix(inputFile, outputFile, targetCol)

.слияние()

Эта функция объединяет строки двух файлов по общему значению столбца.

.merge(inputFile, targetCol, outputFile)

.понижать()

Эта функция преобразует строковое значение в нижний регистр.

.toLower(inputFile, targetCol, outputFile)

.unixToISO()

Эта функция изменяет значение даты и времени столбца с UNIX на ISO.

.unixToISO(inputFile, indexCol, outputFile, targetCol)

Примеры

Вот несколько примеров для каждой функции, предоставляемой пакетом csvtransformers:

.aggregatorBool()

// simplest example using minimum required input
csvtransformers.aggregatorBool('input.csv')
// skipping optional arguments
csvtransformers.aggregatorBool('input.csv', undefined, 'product_id')

.агрегаторInt()

// simplest example using minimum required input
csvtransformers.aggregatorInt('input.csv', 'product_id', 'rating')
// skipping optional arguments
csvtransformers.aggregatorInt('input.csv', 'product_id', 'rating', 'output.csv')

.binaryToBoolean()

// simplest example using minimum required input
csvtransformers.binaryToBoolean('input.csv', 'binary_col')
// skipping optional arguments
csvtransformers.binaryToBoolean('input.csv', 'binary_col', 'output.csv')

.booleanToBinary()

// simplest example using minimum required input
csvtransformers.booleanToBinary('input.csv', 'boolean_col')
// skipping optional arguments
csvtransformers.booleanToBinary('input.csv', 'boolean_col', 'output.csv')

.обычай()

// backticks `` are required for .custom() scripts
const script = `
import pandas as pd
# read in csv file
df = pd.read_csv('my_boring_data.csv')
# convert all values in 'name' column to string 'hotdog'
df['name'] = df['name'].astype(str).replace('', 'hotdog')
# save changes to csv file
df.to_csv('my_cool_data.csv', index=False)
`
csvtransformers.custom(script)

.генератор()

// 3 column csv file creation
function nameGen() {
 const names = ['John','Jane','Taylor','Sally','Tom','Harry','Lily','Olivia','Marcus','Emma'];
 const randomIndex = Math.floor(Math.random() * names.length);
 return names[randomIndex];
}
function birthdayGen() {
 let year = Math.floor(Math.random() * (2020–1900 + 1)) + 1900;
 let month = Math.floor(Math.random() * 12) + 1;
 let day;
 if (month === 2) {
 day = Math.floor(Math.random() * 28) + 1;
 } else if (month === 4 || month === 6 || month === 9 || month === 11) {
 day = Math.floor(Math.random() * 30) + 1;
 } else {
 day = Math.floor(Math.random() * 31) + 1;
 }
 // return the random birthday
 return `${month}/${day}/${year}`;
}
csvtransformers.generator('output.csv', 'id,name,birthday\n', 1e8, nameGen, birthdayGen)

.isoToUnix()

// simplest example
csvtransformers.isoToUnix('input.csv')
// skipping optional arg
csvtransformers.isoToUnix('input.csv', undefined, 'datetime')

.слияние()

// simplest example
csvtransformers.merge('input1.csv', 'input2.csv', 'common_col')
// skipping optional arg
csvtransformers.merge('input1.csv', 'input2.csv', 'common_col', 'output.csv')

.понижать()

// simplest example
csvtransformers.toLower('input.csv', 'string_col')
// skipping optional arg
csvtransformers.toLower('input.csv', 'string_col', 'output.csv')

.unixToISO()

// simplest example
csvtransformers.unixToISO('input.csv', 'user_id')
// skipping optional arg
csvtransformers.unixToISO('input.csv', 'user_id', undefined, 'datetime')

Заключение

Пакет npm csvtransformers упрощает управление большими файлами CSV в Javascript, предоставляя набор простых функций, которые позволят вам управлять гигабайтами данных CSV за считанные минуты. Используя этот пакет, вы можете преодолеть ограничения памяти, часто возникающие при работе с большими наборами данных. Попробуйте csvtransformers и упростите работу с CSV-файлами с помощью Javascript! Или дайте python-shell или методу процесса spawn_child шанс выполнить ваш python в nodeJS!

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