我可以使用批处理文件删除 .csv 中的空白列吗

我可以使用批处理文件删除 .csv 中的空白列吗

我当前的 .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,则可以:

  1. 在电子表格中打开 CVS 文件(例如,OpenOffice Calc或 MS Excel),删除两列,然后保存文件。但很难实现自动化,因此仅在需要执行一次或很少执行时使用。
  2. 或下载适用于 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 行开始(跳过指定的列标题)
  • 将其通过管道传输到输出文件。

相关内容