Пакетный файл для разделения CSV файла
У меня очень большой файл .csv( > 500 Мб), и я хочу разбить его на меньшие .csv файлы в командной строке. (В основном пытается найти функцию разделения "linux" в Windows ".
Это должна быть партия script, так как моя машина имеет только установленные окна, а запрос программного обеспечения - это боль. Я наткнулся на несколько примеров кода (http://forums.techguy.org/software-development/1023949-split-100000-line-csv-into.html), однако он не работает, когда я выполняю пакет. Все, что я получаю, это один выходной файл, который составляет всего 125 КБ, когда я попросил его разобрать каждые 20 000 строк.
Кто-нибудь сталкивался с подобной проблемой и как вы решили проблему?
Ответы
Ответ 1
Попробуйте следующее:
@echo off
setLocal EnableDelayedExpansion
set limit=20000
set file=export.csv
set lineCounter=1
set filenameCounter=1
set name=
set extension=
for %%a in (%file%) do (
set "name=%%~na"
set "extension=%%~xa"
)
for /f "tokens=*" %%a in (%file%) do (
set splitFile=!name!-part!filenameCounter!!extension!
if !lineCounter! gtr !limit! (
set /a filenameCounter=!filenameCounter! + 1
set lineCounter=1
echo Created !splitFile!.
)
echo %%a>> !splitFile!
set /a lineCounter=!lineCounter! + 1
)
Как показано в приведенном выше коде, он разбивает исходный файл csv на несколько файлов csv с лимитом в 20 000 строк. Все, что вам нужно сделать, - это изменить переменную !file!
и !limit!
. Надеюсь, поможет.
Ответ 2
Бесплатное приложение для Windows, которое делает это
http://www.addictivetips.com/windows-tips/csv-splitter-for-windows/
Ответ 3
Используйте команду cgwin SPLIT. образцы
Чтобы разделить файл каждые 500 строк:
split -l 500 [filename.ext]
по умолчанию он добавляет xa, xb, xc... к имени файла после расширения
Чтобы сгенерировать файлы с номерами и заканчивающиеся в правильном расширении, используйте следующие
split -l 1000 sourcefilename.ext destinationfilename -d --additional-suffix=.ext
положение -d или -l не имеет значения,
- "-d" такой же, как и --- числовые суффиксы
- "-l" такой же, как - -l ines
Для большего: раскол --help
Ответ 4
Если разбивать очень большие файлы, то найденное мной решение является адаптацией от этого, а PowerShell "встроен" в пакетный файл. Это работает быстро, в отличие от многих других вещей, которые я пробовал (я не знал бы о других вариантах, размещенных здесь).
Способ использования mysplit.bat
ниже
mysplit.bat <mysize> 'myfile'
Примечание. script должен был использовать первый аргумент как размер разделения. В настоящее время он жестко закодирован со скоростью 100 Мб. Нетрудно это исправить.
Примечание 2: Имя файла должно быть заключено в одинарные кавычки. Другие альтернативы цитирования, по-видимому, не работают.
Примечание 3: Он разбивает файл на заданное количество байтов, а не на заданное количество строк. Для меня это было достаточно хорошо.
Возможно, некоторые строки кода могут быть добавлены, чтобы завершить чтение каждого фрагмента, вплоть до следующего CR/LF. Это будет разделено на полные строки (не с их постоянным числом), не жертвуя временем обработки.
Script mysplit.bat
:
@REM Using https://stackoverflow.com/questions/19335004/how-to-run-a-powershell-script-from-a-batch-file
@REM and https://stackoverflow.com/questions/1001776/how-can-i-split-a-text-file-using-powershell
@PowerShell ^
$upperBound = 100MB; ^
$rootName = %2; ^
$from = $rootName; ^
$fromFile = [io.file]::OpenRead($from); ^
$buff = new-object byte[] $upperBound; ^
$count = $idx = 0; ^
try { ^
do { ^
'Reading ' + $upperBound; ^
$count = $fromFile.Read($buff, 0, $buff.Length); ^
if ($count -gt 0) { ^
$to = '{0}.{1}' -f ($rootName, $idx); ^
$toFile = [io.file]::OpenWrite($to); ^
try { ^
'Writing ' + $count + ' to ' + $to; ^
$tofile.Write($buff, 0, $count); ^
} finally { ^
$tofile.Close(); ^
} ^
} ^
$idx ++; ^
} while ($count -gt 0); ^
} ^
finally { ^
$fromFile.Close(); ^
} ^
%End PowerShell%
Ответ 5
Это даст вам строки 1 to 20000
в newfile1.csv
и строки 20001 to the end
в файле newfile2.csv
Он также преодолевает ограничение символа 8K на строку.
Это использует вспомогательный пакетный файл с именем findrepl.bat
from - https://www.dropbox.com/s/rfdldmcb6vwi9xc/findrepl.bat
Поместите findrepl.bat
в ту же папку, что и командный файл или путь.
Он более надежный, чем простой командный файл, и быстрее.
findrepl /o:1:20000 <file.csv >newfile1.csv
findrepl /o:20001 <file.csv >newfile2.csv
Ответ 6
Я нашел этот вопрос, ища аналогичное решение. Я изменил ответ, который @Dale дал в моих целях. Я хотел кое-что, что было немного более гибким и имело некоторый захват ошибки. Просто подумал, что могу поместить его сюда для тех, кто ищет то же самое.
@echo off
setLocal EnableDelayedExpansion
GOTO checkvars
:checkvars
IF "%1"=="" GOTO syntaxerror
IF NOT "%1"=="-f" GOTO syntaxerror
IF %2=="" GOTO syntaxerror
IF NOT EXIST %2 GOTO nofile
IF "%3"=="" GOTO syntaxerror
IF NOT "%3"=="-n" GOTO syntaxerror
IF "%4"=="" GOTO syntaxerror
set param=%4
echo %param%| findstr /xr "[1-9][0-9]* 0" >nul && (
goto proceed
) || (
echo %param% is NOT a valid number
goto syntaxerror
)
:proceed
set limit=%4
set file=%2
set lineCounter=1+%limit%
set filenameCounter=0
set name=
set extension=
for %%a in (%file%) do (
set "name=%%~na"
set "extension=%%~xa"
)
for /f "usebackq tokens=*" %%a in (%file%) do (
if !lineCounter! gtr !limit! (
set splitFile=!name!_part!filenameCounter!!extension!
set /a filenameCounter=!filenameCounter! + 1
set lineCounter=1
echo Created !splitFile!.
)
cls
echo Adding Line !splitFile! - !lineCounter!
echo %%a>> !splitFile!
set /a lineCounter=!lineCounter! + 1
)
echo Done!
goto end
:syntaxerror
Echo Syntax: %0 -f Filename -n "Number Of Rows Per File"
goto end
:nofile
echo %2 does not exist
goto end
:end
Ответ 7
Скачайте и используйте CSV Splitter CSV Splitter.