【问题标题】:Vlookup style csv merge using batch file使用批处理文件的 Vlookup 样式 csv 合并
【发布时间】:2014-03-12 15:05:41
【问题描述】:

我有一个小批处理文件,它根据匹配值合并两个 csv 文件。见以下代码:

@ECHO OFF 
for /f "tokens=1 delims=, skip=1" %%i in (File2.csv) do @findstr  "%%i," File1.csv >nul & If     errorlevel 0 if not errorlevel 1 (for /f "tokens=1-4 delims=," %%m in ('findstr /i /L "%%i," File1.csv') do (@echo %%1,%%2,%%3,%%4>>output.csv 
echo %%i))

我的 file2.csv 包含 4 列数据,我的 file1.csv 包含 2 列数据。两者的第 1 列是我想要匹配的唯一值(它是一个包含扩展名的文件名)。

我希望我的输出 csv 包含来自 File2.csv 的所有 4 列数据,以及与之匹配的 File1.csv 的第 2 列。

然后,我希望删除输出 csv 的第一列,并将其替换为 File1.csv 中的附加列 2。

我希望我已经解释得足够好,我只是想知道这是否可能。

任何帮助将不胜感激!

【问题讨论】:

  • 什么类型的数据?显示所需输出的示例会很有帮助。为了澄清,匹配每个文件的第 1 列并输出 file2 中的所有列 + file1 中的第 2 列?
  • 有没有一种方法可以让我更轻松地上传示例文件?
  • 没有 StackOverflow 原生的上传功能,但 pastebingist 很受欢迎。否则,您必须将粘贴复制到您的问题中。

标签: batch-file csv


【解决方案1】:

编辑修改代码以响应 cmets

编辑 2File1.csv 中的引号已删除

下面的批处理文件假设如下:

文件 1.csv:

"file name.ext","col1-2"

文件2.csv:

file name.ext,col2-2,col2-3,col2-4

输出.csv:

col1-2,col2-2,col2-3,col2-4

.

@echo off
setlocal EnableDelayedExpansion

rem Load File1 as lookup table:
for /F "tokens=1,2 delims=," %%a in (File1.csv) do (
   set "filename=%%~a"
   set "col1_2[!filename: =_!]=%%~b"
)

rem Process File2:
for /F "tokens=1* delims=," %%a in (File2.csv) do (
   set "filename=%%a"
   for /F %%f in ("!filename: =_!") do if defined col1_2[%%f] (
      echo !col1_2[%%f]!,%%b
   ) else (
      echo NoMatchingFilename,%%b
   )
)

【讨论】:

  • 假设已经足够接近了,只是我不需要输出末尾的第 1-2 列,我只需要它来替换列 a 中的文件名。另外我的数据不包含标题,不确定这是否会影响它?
  • 请清楚这一点:File1.csv 和 File2.csv 不包含标题吗?那么,你代码中for命令中的skip=1是干什么用的呢?
  • 这是正确的,没有包含标题,并且此代码是通过将代码位复制和粘贴在一起编译的。我在这方面没有经验,因此我自己并不完全理解代码。很抱歉造成混乱!
  • 谢谢,这会产生我想要的确切格式,但它似乎与文件不匹配。两个 csv 都有匹配值,但在第 1 列的输出中,我只有 NoMatchingFilename
  • 请忽略我的最后一条评论,它不匹配,因为我的 file1.csv 包含数据周围的 "。谢谢。
猜你喜欢
  • 2014-03-31
  • 2015-05-05
  • 2020-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-31
相关资源
最近更新 更多