我正在尝试创建一个批处理文件,该文件将编辑 .csv 并删除第一列以及文件中包含的任何摘要行。然而,我对编程批处理文件还很陌生,所以我不确定开始这个的最佳方式,如果你能包含代码如何工作的基本解释,这样我就可以在 future !
,Type,Date,Num,Name,Memo,Member,Clr,Split,Alias,Value,Balance
ABB - Egypt,,,,,,,,,,,
ElAin EL-Sokhna,,,,,,,,,,,
,Invoice,09-06-10,12005,ABB - EL-Sokhna,,Accounts Receivable,,Training Income,15000,,15000
,Invoice,09-14-11,12005,ABB - EL-Sokhna,“ElAin EL-Sokhna“ Trainer for OTS Application: First two weeks,Training Income,,Accounts,,150001,0
Total ElAin EL-Sokhna,,,,,,,,,241194,210400,301794
ABB - Egypt - Other,,,,,,,,,,,
这个文件有各种迭代,因为它们来自月度报告,我需要删除第一(空)列,以及任何看起来像
ABB - Egypt,,,,,,,,,,,
或 Total ElAin EL-Sokhna,,,,,,,,,241194,210400,301794
的行所以输出应该是:
Type,Date,Num,Name,Memo,Member,Clr,Split,Alias,Value,Balance
Invoice,09-06-10,12005,ABB - EL-Sokhna,,Accounts,,Training Income,15000,,15000
Invoice,09-14-11,13002,ABB - EL-Sokhna,“ElAin EL-Sokhna“ Trainer for OTS Application: First two weeks,Training Income,,Accounts,,150001,0
感谢您的输入!
编辑:似乎我在我的 OP 中不够清楚(对不起,第一次来这里)。
这里需要进行两个过程,必须删除每个文件中的第一列,并且需要删除标题行
ABB - Egypt,,,,,,,,,,,
或摘要行 Total ElAin EL-Sokhna,,,,,,,,,241194,210400,301794
的任何行。所有需要保留的行都会被大部分填入,比如
,Type,Date,Num,Name,Memo,Member,Clr,Split,Alias,Value,Balance
或者,Invoice,09-06-10,12005,ABB - EL-Sokhna,,Accounts Receivable,,Training Income,15000,,15000
注意,和第二行一样,里面可能有一些缺失值,所以搜索类似“,, “不管用。 最佳答案
批处理是一种用于修改文本文件的糟糕语言。有很多特殊情况需要神秘的知识来解决问题。您可能有一个脚本似乎可以做您想做的事,然后您的数据中出现了一些皱纹,整个脚本可能需要重新设计。
关于您的具体问题,在我看来,您只想保留以逗号开头的行,这意味着第一列是空的。在剩余的行中,您要删除第一(空)列。
假设您要保留的行的第二列都没有空值,那么有一个非常简单的解决方案:
@echo off
>"%~1.new" (for /f "delims=, tokens=*" %%A in ('findstr "^," %1') do echo %%A)
move /y "%~1.new" %1 >nul
该脚本期望文件作为第一个也是唯一的参数传递。因此,如果您的脚本名为“fixCSV.bat”,并且要修改的文件为“c:\test\file.csv”,那么您将使用:
fixCSV "c:\test\file.csv"
%1
扩展为第一个参数的值,%~1
是相同的,除了它还会去除可能存在或可能不存在的任何封闭引号。FINDSTR 命令读取文件并只写出以逗号开头的行。 FOR/F 命令迭代每一行输出。 "delims=, tokens=*"选项有效地从每一行中去除所有前导逗号,结果在变量
%%A
中,然后被 ECHO 处理。整个构造被括在括号中,并且 stdout 被重定向到一个临时文件。最后,临时文件被移动到原始文件的顶部,从而替换它。如果第 2 列可能为空,则结果将被破坏,因为它删除了所有前导逗号(在本例中为第 1 列和第 2 列)。脚本必须更复杂才能补偿。您需要设置一个变量,然后使用延迟扩展来获取子字符串,跳过第一个字符。但是如果 %%A 变量包含
!
字符,则延迟扩展会破坏它的扩展。所以延迟扩展必须打开和关闭。你开始明白我所说的许多特殊情况是什么意思。@echo off
setlocal disableDelayedExpansion
>"%~1.new" (
for /f "delims=" %%A in ('findstr "^," %1') do (
set "ln=%%A"
setlocal enableDelayedExpansion
echo !ln:~1!
endlocal
)
)
move /y "%~1.new" %1 >nul
随着批处理脚本变得越来越复杂,它们变得越来越慢。对于大多数文件来说,这可能不是问题,但如果文件真的很大(比如数百兆字节),那么它可能会成为一个问题。
我几乎不再使用纯批处理来修改文本文件了。相反,我使用了我编写的名为 JREPL.BAT 的混合 JScript/批处理实用程序。该实用程序是纯脚本,可以在 XP 以后的任何 Windows 机器上本地运行。 JREPL.BAT 能够使用正则表达式替换有效地修改文本文件。正则表达式可能看起来很神秘,但它们非常值得学习。
假设您的 PATH 中某处有 JREPL.BAT,那么您只需要以下命令:
jrepl "^,(.*)" "$1" /jmatch /f "yourFile.csv" /o -
/F 选项指定要读取的文件。
值为
-
的/O 选项指定输出应替换原始文件。/JMATCH 选项指定将每个替换值写出到一个新行。所有其他文本都被删除。
第一个参数是搜索表达式。它匹配以逗号开头的任何行,之后的所有内容都在名为 $1 的变量中捕获。
第二个参数指定替换值,它只是变量 $1 中捕获的值。
关于batch-file - 通过批处理从csv文件中删除一些列和行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28079306/