Подтвердить что ты не робот

Пакетный файл для разделения CSV файла

У меня очень большой файл .csv( > 500 Мб), и я хочу разбить его на меньшие .csv файлы в командной строке. (В основном пытается найти функцию разделения "linux" в Windows ".

Это должна быть партия script, так как моя машина имеет только установленные окна, а запрос программного обеспечения - это боль. Я наткнулся на несколько примеров кода (http://forums.techguy.org/software-development/1023949-split-100000-line-csv-into.html), однако он не работает, когда я выполняю пакет. Все, что я получаю, это один выходной файл, который составляет всего 125 КБ, когда я попросил его разобрать каждые 20 000 строк.

Кто-нибудь сталкивался с подобной проблемой и как вы решили проблему?

4b9b3361

Ответ 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!. Надеюсь, поможет.

Ответ 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.