删除/替换逗号分隔的字符

时间:2017-10-02 22:43:28

标签: csv batch-file vbscript

我正在尝试通过逗号(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'

谢谢!

1 个答案:

答案 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

您需要更改sourcedirdestdir的设置以适合您的具体情况。

我使用了一个名为q46534752.txt的文件,其中包含我的测试数据。

生成定义为%outfile%

的文件

标题行的处理是一个问题。显示的代码应该按照您的要求执行,但是当进程要删除该列时,在结果文件中保留列名称似乎不合逻辑。要同时处理标题行,请删除第一个for行并从第二行中删除skip=1(跳过第一行)。

基本问题是批处理将一串分隔符视为单个分隔符,因此分隔这些分隔符是必要的。这对于metavariable是不可能的,但可以通过将metavariable转换为普通环境变量(line)并在该普通变量上执行字符串替换仪式来在循环内完成在delayed expansion模式下。

所以 - 用,替换每个|,,然后使用|作为分隔符处理结果字符串。请注意,metavariable与第二个for的情况不同 - cmd区分大小写的少数情况之一。重新构造字符串,省略第7列(%% G)并使用*令牌,这意味着第八个令牌(%% H)在最高明确提到的令牌号(7)和{之后}接收余数。删除剩余的echo个字符后,{1}}。

请注意,拒绝SO上的代码请求是正常的策略,并且只能以修复错误代码的方式进行响应。但是,在这种情况下,后续浏览器可能会发现此响应是执行类似任务的关键,因此避免不必要地发布。而且,我无聊无聊。