我正在尝试通过逗号(CSV)分隔的批处理或vbs文本删除始终位于相同位置的文本。它不会影响第一行,只会影响第2行。
文件中的示例文字:
Code,Batch,File #,Reg Hours,O/T,Cost Number,Rate,Earnings,Earnings,Memo Code,Memo Amount,Earnings Code,Earnings Amount,Hours Code,Hours Amount,Earnings Code,Earnings Amount,Adjust Code,Adjust Amount
ABC,123,3980 ,78.52,,12331,10.00,,,,,,,,
ABC,123,4026 ,29.38,,12331,10.00,,,,,,,,
ABC,123,5065 ,64.46,,12331,10.00,,,,,,,,
ABC,123,5125 ,80.00, 0.54,12331,11.00,,,,,,,,
我想以文字结尾:
Code,Batch,File #,Reg Hours,O/T,Cost Number,Rate,Earnings,Earnings,Memo Code,Memo Amount,Earnings Code,Earnings Amount,Hours Code,Hours Amount,Earnings Code,Earnings Amount,Adjust Code,Adjust Amount
ABC,123,3980 ,78.52,,12331,,,,,,,,,
ABC,123,4026 ,29.38,,12331,,,,,,,,,
ABC,123,5065 ,64.46,,12331,,,,,,,,,
ABC,123,5125 ,80.00, 0.54,12331,,,,,,,,,
唯一的区别是费率区域。它是左边的第7个分隔值,或者是右边的第9个分隔值。第一行保持不变。
批处理/ vbs是否有办法确定逗号分隔值位置,删除值或用'nothing'替换它,并忽略第一行?
对于此示例,我们可以假设该文件将始终命名为file.csv,并位于D:\ location - 'D:\ location \ file.csv'
谢谢!
答案 0 :(得分:0)
REM <!-- language: lang-dos -->
@ECHO Off
SETLOCAL ENABLEDELAYEDEXPANSION
SET "sourcedir=U:\sourcedir"
SET "destdir=U:\destdir"
SET "filename1=%sourcedir%\q46534752.txt"
SET "outfile=%destdir%\outfile.txt"
:: Remove the output file
DEL "%outfile%" >NUL 2>nul
:: To reproduce the first line intact
FOR /f "usebackqdelims=" %%a IN ("%filename1%") DO >"%outfile%" ECHO %%a&GOTO hdrdone
:hdrdone
(
REM to process the header line, remove the "skip=1" from the "for...%%a" command
FOR /f "usebackqskip=1delims=" %%a IN ("%filename1%") DO (
REM step 1 - replace all commas with "|," to separate separators
SET "line=%%a"
SET "line=!line:,=|,!"
FOR /f "tokens=1-7*delims=|" %%A IN ("!line!") DO (
SET "line=%%A%%B%%C%%D%%E%%F%%H"
ECHO !line:^|=!
)
)
)>>"%outfile%"
GOTO :EOF
您需要更改sourcedir
和destdir
的设置以适合您的具体情况。
我使用了一个名为q46534752.txt
的文件,其中包含我的测试数据。
生成定义为%outfile%
的文件标题行的处理是一个问题。显示的代码应该按照您的要求执行,但是当进程要删除该列时,在结果文件中保留列名称似乎不合逻辑。要同时处理标题行,请删除第一个for
行并从第二行中删除skip=1
(跳过第一行)。
基本问题是批处理将一串分隔符视为单个分隔符,因此分隔这些分隔符是必要的。这对于metavariable
是不可能的,但可以通过将metavariable
转换为普通环境变量(line
)并在该普通变量上执行字符串替换仪式来在循环内完成在delayed expansion
模式下。
所以 - 用,
替换每个|,
,然后使用|
作为分隔符处理结果字符串。请注意,metavariable
与第二个for
的情况不同 - cmd
区分大小写的少数情况之一。重新构造字符串,省略第7列(%% G)并使用*
令牌,这意味着第八个令牌(%% H)在最高明确提到的令牌号(7)和{之后}接收余数。删除剩余的echo
个字符后,{1}}。
请注意,拒绝SO上的代码请求是正常的策略,并且只能以修复错误代码的方式进行响应。但是,在这种情况下,后续浏览器可能会发现此响应是执行类似任务的关键,因此避免不必要地发布。而且,我无聊无聊。