尝试使用批处理文件重新格式化非常大的csv

时间:2013-12-03 06:23:30

标签: arrays windows string batch-file csv

我有一个以下列格式导出数据的应用程序:

1a,1b,1c 1 ,1c 2 ,1c 3 ,...(最多1c 100 ),1d 1 ,1d 2 ,1d 3 ,...(最多1d 100
2a,2b,2c 1 ,2c 2 ,2c 3 ,...(最多2c 100 ) ,2d 1 ,2d 2 ,2d 3 ,...(最多2d 100 ) 等

我试图将其重新格式化为

1A,1B,1C <子> 1 ,1D <子> 1
图1A,1B,1C <子> 2 ,1D <子> 2


图1A,1B,1C <子> 100 ,1D <子> 100
图2a,2b,2c的<子> 1 ,2D <子> 1
图2a,2b,2c的<子> 2 ,2D <子> 2

我认为如果可以一次完成一行,我可以循环浏览文件。但是,我找不到使用标记,列表或甚至作为字符串函数执行单行的方法。在单个操作中处理的数据太多(每个值大约为12个字符)。令牌限制在(大致)64/202,列表大约为107/202,字符串大约为1000/2300

有谁知道如何将其写入新文件?

我正在尝试这样的事情:

@echo off
setlocal enableDelayedExpansion
set dimCnt=0
<example.csv (
  set /p "dimList=" >nul
  for %%D in (!dimList!) do (
    set /a dimCnt+=1
    set "dim[!dimCnt!]=%%D"
  )
)
echo
for /l %%I in (3 1 102) do echo !dim[1]!,!dim[2]!,!dim[%%I]!
</code>

..除了我错过了行中的最后一个变量(需要向它添加100)这一事实,我不能从列表中获得超过80-110的值(我猜这取决于值字符串长度)

3 个答案:

答案 0 :(得分:3)

@echo off
    setlocal enableextensions enabledelayedexpansion

    (for /f "tokens=1,2,* delims=," %%a in (example.csv) do (
        set "data=%%c"
        set "i=0"
        for %%f in ("!data:,=" "!") do (
            set /a "i+=1"
            set "d[!i!]=%%~f"
        )
        set /a "end=!i!/2"
        set /a "j=!end!+1"
        for /l %%i in (1 1 !end!) do (
            for %%j in (!j!) do echo %%a,%%b,!d[%%i]!,!d[%%j]!
            set /a "j+=1"
        )
    )) > output.csv

    endlocal

迭代文件,获取行中的前两个标记(%% a和%% b),行的其余部分(%% c)被拆分,每个值存储在环境变量数组中(种类)的)。然后,从开始和中间迭代数组,读取所需的值以追加到%% a和%% b并生成输出文件。

答案 1 :(得分:0)

@ECHO OFF
SETLOCAL
(
 FOR /f "tokens=1,2,*delims=," %%a IN (u:\long.csv) DO (
 SET rpta=%%a
 SET rptb=%%b
 CALL :rptcd %%c
 )
)>newfile.txt
GOTO :EOF

:rptcd
SET /a lines=100
SET lined=%*
FOR /l %%x IN (1,1,99) DO CALL SET lined=%%lined:*,=%%
:loop
IF %lines%==0  GOTO :EOF 
SET /a lines-=1
CALL SET lined=%lined:*,=%
FOR /f "delims=," %%x IN ("%lined%") DO ECHO %rpta%,%rptb%,%1,%%x&shift&GOTO loop
GOTO :eof

这应该让你去 - 只需要更改输入文件名和输出文件名...

答案 2 :(得分:0)

您的代码不起作用,因为SET / P读取的内容不超过1023个字节。此时它返回到目前为止读取的数据,然后下一个SET / P从中断处继续。调整代码以进行补偿将非常困难。你最好在MC ND的答案中使用FOR / F。但要注意,批处理在几乎所有情况下都有每行8191个字符的硬限制。

更好的是,您可以使用其他脚本语言,如JScript,VBS或PowerShell。性能会好得多,而且代码更强大,而且远没有那么神秘。我喜欢使用批处理,但它不是一个好的文本处理语言。