【问题标题】:Moving files based on CSV values根据 CSV 值移动文件
【发布时间】:2021-12-29 11:52:55
【问题描述】:

这里是菜鸟。

我有一个包含两列的 csv 文件,它们指定源文件路径和目标路径。我有大约 1500 多行要执行。有没有办法通过 bat 文件或其他任何方法来批处理这个?

我的 CSV 中的一行如下所示:

Source Path,Dest Path
C:\Users\Nick\Pictures\XXXXXXX.img,C:\Users\Nick\Pictures\Export\XXXXXXX.img

【问题讨论】:

  • FOR /F "SKIP=1 USEBACKQ TOKENS=1,2 DELIMS=," %%G IN ("myfile.csv") DO echo source=%%G destination=%%H
  • @Squashman:小心,当路径包含逗号并且字段被引用时,这可能会中断。
  • ...但是@Joey 是一条包含不带引号的字段以及使用一个或多个逗号的字符串数据的记录,从技术上讲,它不是一个有效的逗号分隔值!
  • @Compo:因此我说引用,是的。但是这些东西的存在要求您的字段拆分是引号感知的,而几乎所有琐碎的选项都不是。

标签: csv batch-file


【解决方案1】:

我可能不会使用批处理文件来解决这个问题,而是使用 PowerShell。可以批量进行,但出了名的不可靠,尤其是在你刚开始时没有预料到的字符周围。

在 PowerShell 中,这可能很简单

Import-Csv files.csv | ForEach-Object {
  Move-Item -LiteralPath $_.'Source Path' -Destination $_.'Dest Path'
}

您可能需要根据需要创建目录,可能是这样的:

Import-Csv files.csv | ForEach-Object {
  New-Item -ItemType Directory (Split-Path -Parent $_.'Source Path')
  Move-Item -LiteralPath $_.'Source Path' -Destination $_.'Dest Path'
}

【讨论】:

  • 嗨乔伊!感谢您的及时回复!它工作得很好,除了它在 whatIF 运行期间显示“路径中的非法字符”。我的大部分文件都是多语言的,并且我在 Windows 中启用了“beta UFT-8”设置。我还仔细检查了我的 CSV 以确保没有间距等。我将如何解决这个问题?我统计了大约 10 多个错误,所以我也可以手动进行排序。无论如何要添加日志文件吗?
  • @NickLi,因为您上面使用的命令没有为您的输入 CSV 指定特定的文件编码。由于较新版本的 PowerShell 默认使用 utf8NoBOM,我必须假设您使用的是较旧版本,可能是 PowerShell v5.1。旧版本使用默认系统的活动代码页 (可能是 ANSI)。因此,我建议您通过指定不同的编码来尝试。我建议使用 UTF-8,所以将 Import-Csv files.csv 更改为 Import-Csv -LiteralPath 'S;\omeFolder\MyFile.csv' -Encoding UTF8。然后再试一次。
  • @Compo 嗨,谢谢!它现在使用 UTF8 显示正确的文本。
猜你喜欢
  • 1970-01-01
  • 2011-11-17
  • 1970-01-01
  • 1970-01-01
  • 2015-10-09
  • 1970-01-01
  • 1970-01-01
  • 2013-11-20
相关资源
最近更新 更多