用于将三个csv文件列合并为一个列的Windows脚本

时间:2013-03-23 10:31:25

标签: csv excel-vba vbscript batch-file vba

我可以在excel中执行此操作,例如使用= CONCATENATE函数将多个列合并为一个列。但我想要做的是将同一文件夹中3个不同csv文件中的列合并为一个列。我想通过批处理脚本运行它,所以像VBScript那样的CMD复制命令似乎不起作用。

这是文件结构:

File1.csv

  • 第1栏:www.domain.com /
  • 第2栏:www.nwdomain.com /
  • 第3栏:www.stackdomain.com /
  • 第4栏:www.example-domain.com /

File2.csv

  • 第1栏:关于
  • 第2栏:联系
  • 第3栏:索引
  • Column4:faq

File3.csv

  • Column1:.html
  • 第2栏:.html
  • Column3:.html
  • Column4:.html

输出文件中的结果:

  • 第1栏:www.domain.com/about.html

  • 第2栏:www.nwdomain.com/contact.html

  • 第3栏:www.stackdomain.com/index.html

  • 第4栏:www.example-domain.com/faq.html

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

@ECHO OFF
SETLOCAL
::
(
FOR /f "tokens=1*delims=:" %%a IN ('findstr /n /r "." ^<csv1.csv') DO (
 FOR /f "tokens=1*delims=:" %%c IN ('findstr /n /r "." ^<csv2.csv') DO ( 
  IF %%a==%%c FOR /f "tokens=1*delims=:" %%e IN ('findstr /n /r "." ^<csv3.csv') DO (
   IF %%a==%%e (
    FOR /f "tokens=1-4delims=," %%m IN ("%%b") DO (
     FOR /f "tokens=1-4delims=," %%r IN ("%%d") DO (
      FOR /f "tokens=1-4delims=," %%w IN ("%%f") DO (
       ECHO.%%m%%r%%w,%%n%%s%%x,%%o%%t%%y,%%p%%u%%z
      )
     )
    )
   )   
  )
 )
)
)>new.csv

应该有用。

它的作用是什么,

  1. 对于file1,FINDSTR“输出”包含任何以行号和冒号(/r ".")开头的字符(/n)的行。这个“输出”由FOR /f读取并解析为2个标记,由冒号分隔(tokens=1*表示'第一个标记;所有其余部分'),效果是放置%%a中的行号以及该行的其余部分,即原始.csv%%b
  2. 的行
  3. 对于csv1的{​​{1}}重复的每一行,这次将行号放在csv2中,行%%c
  4. 仅当行号匹配时,使用%%d中的号码和csv3
  5. 中的文字重复%%e
  6. 如果上一个文件中的行号匹配,则解析%%f%%b%%d中的每一行中的行文本 - 这次选择以逗号分隔的四列。此数据显示在%%f .. %%m%%p .. %%r%%u .. %%w我们所要做的就是对接找到适当的部分并插入逗号。
  7. DONE!

    <小时/> 源和测试结果,包括运行时间(5行)

    %%z

答案 1 :(得分:1)

在VBScript中:

Const delim = ","

Set fso = CreateObject("Scripting.FileSystemObject")

Set f1 = fso.OpenTextFile("File1.csv")
Set f2 = fso.OpenTextFile("File2.csv")
Set f3 = fso.OpenTextFile("File3.csv")

Do Until f1.AtEndOfStream Or f2.AtEndOfStream Or f3.AtEndOfStream
  a1 = Split(f1.ReadLine, delim)
  a2 = Split(f2.ReadLine, delim)
  a3 = Split(f3.ReadLine, delim)

  n = Min(UBound(a1), UBound(a2), UBound(a3))
  Dim aout(n)

  For i = 0 To n
    aout(i) = a1(i) & a2(i) & a3(i)
  Next

  WScript.StdOut.WriteLine Join(aout, delim)
Loop

f1.Close
f2.Close
f3.Close

Function Min(a, b, c)
  If a<=b Then
    If c<a Then
      Min = c
    Else
      Min = a
    End If
  Else
    If c<b Then
      Min = c
    Else
      Min = b
    End If
  End If
End Function

答案 2 :(得分:0)

虽然不是真正的编程,但是快速而又脏的方法是在Excel中打开所有文件,创建新的XLSXLSX文件,然后在新创建的文件的第一个单元格中使用此公式:

=[File1.csv]File1!A1&[File2.csv]File2!A1&[File3.csv]File3!A1

其中File1.csvFile2.csvFile3.csv是您的CSV文件。 然后拖动列/行以应用公式。