我有一个以下列格式导出数据的应用程序:
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的值(我猜这取决于值字符串长度)
答案 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。性能会好得多,而且代码更强大,而且远没有那么神秘。我喜欢使用批处理,但它不是一个好的文本处理语言。