我当前的 .csv 文件中有九列,但是第二列和第三列是空白的,我想删除它们。有没有办法使用批处理命令从我的 .csv 中删除这些空列或导出没有这些空白列的新 .csv?
答案1
For /F
能够解析 .csv 文件。只需一行,即可直接从命令提示符运行:
for /F "tokens=1,2,3* delims=," %i in (input.csv) do @echo %i,%l>>output.csv
这将逐行遍历 input.csv 并使用逗号作为分隔符,将第一个值存储在 中%i
,将第二个值存储在 中%j
,将第三个值存储在 中,%k
将字符串的其余部分(通过在标记列表中使用星号)存储在 中%l
。通过打印除第二和第三个值之外的所有值,您可以有效地将它们取出。
但是,for /F
不会将空字符串计为标记,因此该命令无法区分两个连续的逗号和一个逗号。如果空列有空格字符,此解决方案确实有效,但否则可能会跳过错误的列。
为了规避这一限制,我们可以编写一个批处理文件,使用字符串替换在两个连续的逗号之间插入一个空格。此替换执行两次,以应对可能出现的三个逗号。中的引号^"!line!^"
是必需的,以表明for /F
必须对字符串而不是文件进行操作,并且已转义以防止!line!
被评估为文字字符串而不是变量。
@echo off
setlocal EnableDelayedExpansion
for /F "delims=" %%a in (input.csv) do (
set line=%%a
set line=!line:,,=, ,!
set line=!line:,,=, ,!
for /F "tokens=1,2,3* delims=," %%i in (^"!line!^") do (
echo %%i,%%l>>output.csv
)
)
结果是一个新 .csv 文件,除了省略了第二列和第三列外,与 input.csv 完全相同。
答案2
您没有指定哪个操作系统。如果您的操作系统自带cut
,请使用它。
cut -d',' -f1,4-9
-d
设置分隔符,在本例中为,
。由于逗号不是特殊字符,因此可以省略引号。
-f
选择字段,在本例中为字段 1 和字段 4 至 9(跳过字段 2 和 3)。
测试文件“example.cvs” foo1,,,ba1,baz1,blah1,wibble1,wubble1 foo2,,,ba2,baz2,blah2,wibble2,wubble2 foo2,,,ba3,,blah3,wibble3,wubble3 foo2,,,ba4,baz4,blah4,wibble4,wubble4
该命令的实际测试:
> cut -d','-f1,4-9 示例.cvs foo1,ba1,baz1,blah1,wibble1,wubble1 foo2,ba2,baz2,blah2,wibble2,wubble2 foo2,ba3,,blah3,wibble3,wubble3 foo2,ba4,baz4,blah4,wibble4,wubble4
Cut 预装了大多数操作系统(例如 OS/X、Linux 发行版、BSD、Solaris ......;几乎所有操作系统(DOS 和 Windows 除外)。
如果您使用的是 Windows,则可以:
- 在电子表格中打开 CVS 文件(例如,OpenOffice Calc或 MS Excel),删除两列,然后保存文件。但很难实现自动化,因此仅在需要执行一次或很少执行时使用。
- 或下载适用于 Windows 的 Unix 工具并将
cut
命令放入批处理文件中。
答案3
我将在记事本(或任何文本编辑器)中打开 CSV 文件,然后搜索并替换,,
为,
。当然,这是假设您的列中没有数据,,
。
答案4
假设您使用的是 Windows,该文件没有标题,并且您可以使用 Powershell,则可以使用以下命令:
导入 Csv .\InFile.csv -标题 col1,col2,col3,col4,col5 -分隔符 ',' | 选择对象 col1,col4,col5 | ConvertTo-Csv | 选择 -skip 2 > .\OutFile.csv
所以:
- 导入 CSV。
- 分配列名以供参考。
- 选择除第 2 列和第 3 列之外的所有 5 列。
- 转换回正确的 CSV。
- 选择该 CSV,从第 2 行开始(跳过指定的列标题)
- 将其通过管道传输到输出文件。