批处理文件复制 CSV 文件中的列

Posted

技术标签:

【中文标题】批处理文件复制 CSV 文件中的列【英文标题】:Batch File to Duplicate column in CSV file 【发布时间】:2020-11-27 21:55:14 【问题描述】:

我需要能够在 CSV 文件中提取一列并将其复制,以便每个文件的开头和结尾都具有相同的确切值。

请参阅下面显示输入和所需输出的示例。

输入

abc,123,tim,cook
xyz,456,steve,jobs

期望的输出

abc,123,tim,cook,123
xyz,456,steve,jobs,456

理想情况下,我想使用批处理脚本来完成这项工作

有什么想法吗?

【问题讨论】:

FOR /F 将是完美的 那么您想将第二个 CSV 列附加到条目的末尾吗?还是您想在每个条目之后附加它? 我不确定这两者之间的区别是什么意思,但我想将每行的第二个条目添加到同一行的末尾。 标题呢?我建议带有重复标头字段的 CSV 格式错误,或者可能会产生问题。 @Compo 对 header 语句是正确的,我添加了一个额外的脚本来附加一个新的标题列,如果它是相关的。例如,如果您的 csv 文件被使用标题作为标识符的 sql 查询读取,则会导致问题,因为如果您使用第一种方法,则有 2 列相同。 【参考方案1】:

示例文件test.csv

@echo off
(for /f "usebackq tokens=1,2,* delims=," %%i in ("test.csv") do (
    echo %%i,%%j,%%k,%%j
 )
)>new.csv

非常简单,我们获取字符串并分配给元变量%%i,然后我们将字符串按, 拆分并仅使用标记2,然后我们回显元变量%%i 并用逗号附加%%a .然后输出将在new.csv

PS!!正如@Compo 在评论中所述,具有重复的标头值可能会产生问题,具体取决于您对文件的处理方式,在这种情况下,您可以指定一个新的标头字段,该字段不重复,只需将该字段附加到标头,只需确保将值 New_HeaderValue 更改为实际的新标头值即可。:

@echo off
(for /f "usebackq delims=" %%i in ("test.csv") do echo %%i,New_HeaderValue & goto :remainder)>new.csv
:remainder
(for /f "usebackq skip=1 tokens=1,2,* delims=," %%i in ("test.csv") do (
    echo %%i,%%j,%%k,%%j
 )
)>>new.csv

【讨论】:

为什么有两个嵌套的for 循环? for /f "usebackq skip=1 tokens=1,2,* delims=," %%i in ("test.csv") do echo %%i,%%j,%%k,%%i @Stephan 不应该是... echo %%i,%%j,%%k,%%j @Stephan,假设我玩得很安全,我从手机发布,没有经过测试。当我再次使用笔记本电脑时,我会修改答案。谢谢 @elzooilogico:是的 - 错字。 @Stephan,现在排序!

以上是关于批处理文件复制 CSV 文件中的列的主要内容,如果未能解决你的问题,请参考以下文章

批处理文件以循环通过远程 Git 分支并将每个分支中的类似 CSV 文件复制到本地目录

如何批处理将多个文件夹下的excel文件(xls,xlsx,csv等)合并成一个文件?

批处理如何批量删除当前文件下所有csv文件的前几行

批处理文件仅 Xcopy 特定文件

如何在powershell中遍历csv文件中的一行

PostgreSQL,试图将日期列从 csv 文件复制到表的列