2013-03-23 53 views
3

我可以在excel中執行此操作,例如使用= CONCATENATE函數將多個列合併到一個列中。但我想要做的是將同一文件夾內的3個不同csv文件中的列合併到一個列中。我想通過批處理腳本運行,所以像VBScript CMD copy命令似乎不起作用。將三個csv文件列合併爲一個列的Windows腳本

這裏是文件結構:

File1.csv

  • column1的:www.domain.com/
  • 列2:www.nwdomain.com/
  • 欄3:萬維網.stackdomain.com/
  • Column4:www.example-domain.com/

File2.csv

  • column1的:約
  • 列2:接觸
  • 欄3:索引
  • Column4:FAQ

File3.csv

  • column1的:.HTML
  • 列2:html的
  • 欄3:html的
  • Column4:html的

結果在輸出文件:

  • column1的: www.domain.com/about.html

  • 列2:www.nwdomain.com/contact.html

  • 欄3:www.stackdomain.com/index.html

  • Column4:www.example-domain.com/faq.html

感謝您的幫助。

回答

0

雖然不是真正的編程,一個快速和骯髒的方法是在Excel中打開所有文件,創建一個新的XLSXLSX文件,然後在新創建的文件的第一個單元格使用這個公式:

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

其中File1.csvFile2.csvFile3.csv是您的CSV文件。 然後拖過列/行以應用公式。

+0

如果我可以運行這個自動 – 2013-03-23 11:15:27

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. 對於文件1,FINDSTR「輸出」,其中包含由行號和冒號(/n)之前的任何字符(/r ".")的任何行。這個「輸出」被FOR /f讀取並且被解析成由冒號分隔的2個標記(tokens=1*表示'第一個標記;該行的所有其餘部分'),並且效果是將行號放入%%a中,其餘的行了,這是從原來的.csv行成%%b
  2. FOR爲csv2csv1重複的每一行,此時放置行號%%c,線%%d
  3. 的只有在訂單號碼相符,重複csv3%%e中的數字和%%f中的文字
  4. 如果來自最後一個文件的行號匹配,分析%%b,%%d%%f中的每一行中的行文本 - 這次選擇四列,用逗號分隔。此數據出現在%%m .. %%p,%%r .. %%u,%%w .. %%z然後我們所要做的就是對齊適當的部分並插入逗號。

完成!


源和測試結果,包括運行時間(5行)

start:21:45:40.87 
end :21:45:41.09 

csv1.csv ========= 
www.domain.com/,www.nwdomain.com/,www.stackdomain.com/,www.example-domain.com/ 
www.domain.com/,www.nwdomain.com/,www.stackdomain.com/,www.example-domain.com/ 
www.domain.com/,www.nwdomain.com/,www.stackdomain.com/,www.example-domain.com/ 
www.domain.com/,www.nwdomain.com/,www.stackdomain.com/,www.example-domain.com/ 
www.domain.com/,www.nwdomain.com/,www.stackdomain.com/,www.example-domain.com/ 
csv2.csv ========= 
about,contact,index,faq 
about,contact,index,faq 
about,contact,index,faq 
about,contact,index,faq 
about,contact,index,faq 
csv3.csv ========= 
.html,.html,.html,.html 
.html,.html,.html,.html 
.html,.html,.html,.html 
.html,.html,.html,.html 
.html,.html,.html,.html 
new.csv ========= 
www.domain.com/about.html,www.nwdomain.com/contact.html,www.stackdomain.com/index.html,www.example-domain.com/faq.html 
www.domain.com/about.html,www.nwdomain.com/contact.html,www.stackdomain.com/index.html,www.example-domain.com/faq.html 
www.domain.com/about.html,www.nwdomain.com/contact.html,www.stackdomain.com/index.html,www.example-domain.com/faq.html 
www.domain.com/about.html,www.nwdomain.com/contact.html,www.stackdomain.com/index.html,www.example-domain.com/faq.html 
www.domain.com/about.html,www.nwdomain.com/contact.html,www.stackdomain.com/index.html,www.example-domain.com/faq.html 
============= 
+0

這似乎是很慢這將工作在5個字符串匹配。 – 2013-03-23 13:07:46

+0

如果你的意思是你只有5行數據,那麼我發佈了我的測試數據並運行結果。我做了一個小修改(在'ECHO。%% m %% r ...'行中''''之前有4個'''''這應該是** 2 ** [將一個僞造的'%'放入輸出]),但這對時序沒有影響。你只使用5行數據?如果是這樣,你可以發佈他們(或編輯版本)。顯然,不要發佈數百行...正如你所看到的,我的運行時間是0.22秒,我不會描述爲特別慢。 OTOH,我有'CMD'決定花費很長時間並需要一個新的CMD實例。 – Magoo 2013-03-23 14:01:22

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 
相關問題