按列合并两个CSV文件(而不是插入新行)

时间:2015-04-07 13:34:35

标签: windows csv batch-file cmd

我创建了两个批处理文件:

1:

dir *.txt %t *.* /w/a/b/-p/o:gen | find "/">rezultate.csv

它从目录中获取所有文本文件的路径和大小以及日期和创建时间,并将结果导出为CSV文件。

2:

@echo off
setlocal EnableDelayedExpansion
if exist results.csv del results.csv
for %%f in (D:\script\*.txt) do (
    set i=0
    for /F "tokens=2 delims=:" %%l in (%%f) do (
        set /A i+=1
        set line!i!=%%l
    )
    echo %%f, !line1!, !line2!,>> D:\script\results.csv
)

它从指定目录获取文件路径以及文件在前2行(也包括文本文件)中包含的内容,并将结果导出为CSV文件。

我尝试组合批处理文件,并设法将两个批处理文件的结果导出到同一个CSV文件中,但第一批文件的输出导出前5行,第二批文件的输出是在接下来的5行中导出。

我想合并批处理文件,以便可以从第一个批处理文件中导出输出,该文件将有一列和5行,并且在同一个CSV中导出第二个批处理文件的输出,该文件有3列但是不在第一批的出口下。我希望CSV仍有5行而是4列。 我还尝试将CS​​V文件与另一个批处理文件合并,但我得到了相同的结果。

请尽可能帮助解决方案,因为我寻找的解决方案超过一周......

以下是我需要CSV文件的方式:

enter image description here

最终结果必须是这样的:

final result

感谢您的帮助@ dohaqatar7。

以下是我今天达到的结果。 关于我想合并CSV文件的方式你是对的。

1:

我为你写了第1部分的剧本,因为它更加精确,我改变了一点,它会是这样的:

@echo off for %%a in (*.txt) do echo %%~ta,%%~za>>results.csv

示例输出sample

2:

我会继续使用我的脚本,因为它会准确地返回我想要的内容并且它是准确的。

@echo off setlocal EnableDelayedExpansion for %%f in (D:\script\*.txt) do ( set i=0 for /F "tokens=2 delims=:" %%l in (%%f) do ( set /A i+=1 set line!i!=%%l ) echo %%f, !line1!, !line2!,>>D:\script\results.csv )

示例输出sample

您的样本也包含最终结果。

至于为合并CSV文件而提供的脚本,我无法使其工作,因为它不会在新的CSV文件中返回输出。请你稍微更改它以便我可以使用它。我希望我现在解释得更好。我会提供更多细节,但我是新来的,我的声誉有限。

如果您可以插入“D:\ scrip \ filename \”的路径,那会很棒,但我可以自己做。

亲切的问候,

2 个答案:

答案 0 :(得分:0)

首先,我不知道您的第一段代码是否符合您的要求。当我运行它时,文件始终为空。此代码执行您声称的第一部分。

@echo off
for %%a in (*.txt) do echo %%~ta,%%~za,%%~fa

如果您的代码适合您,请继续使用它。如果你开始遇到问题,这段代码就可以了。


至于组合CSV文件,我有点不确定你想要什么。这就是我的假设。

您想要a.csv

a1,b1,c1
a2,b2,c2

b.csv

d1
d2

并将它们合并到ab.csv

a1,b1,c1,d1
a2,b2,c2,d2

此代码将采用两个参数,即要合并的文件,并将结果输出到新文件。

@echo off
setlocal enabledelayedexpansion

set "line1=0"
for /f "tokens=*" %%a in (%1) do (
    set "file1[!line1!]=%%a"
    set /a line1+=1
)

set "line2=0"
for /f "tokens=*"  %%a in (%2) do (
    set "file2[!line2!]=%%a"
    set /a line2+=1
)

if !line1! GTR !line2! (
    set /a max=!line1!-1
) else (
    set /a max=!line2!-1
)

set "mergedCSV=%~n1_%~n2.csv"

echo.>%mergedCSV%
for /l %%a in (0,1,%max%) do (
    if "!file1[%%a]!"=="" (
        echo !file2[%%a]! >> %mergedCSV%
    ) else (
        if "!file2[%%a]!"=="" (
            echo !file1[%%a]! >> %mergedCSV%
        ) else (
            echo !file1[%%a]!,!file2[%%a]! >> %mergedCSV%
        )
    )
)

答案 1 :(得分:0)

Set Arg = WScript.Arguments
set WshShell = createObject("Wscript.Shell")
Set Inp = WScript.Stdin
Set Outp = Wscript.Stdout


    On Error Resume Next
    Set Fso = CreateObject("Scripting.FileSystemObject")
    Set File = Fso.OpenTextFile(Arg(1), 1, false)
    If err.number <> 0 then
        Outp.WriteLine "Error: " & err.number & " " & err.description & " from " & err.source
        err.clear
        wscript.exit
    End If
    Do Until Inp.AtEndOfStream And File.AtEndOfStream
    Line = ""
    Line2 = ""
        Line=Inp.readline
        Line2=File.readline
        outp.writeline Line & "," & Line2   
    Loop

在屏幕上使用

cscript //nologo <"path to script.vbs"> "" "c:\file1.txt" < "c:\file2.txt"

放入文件

cscript //nologo <"path to script.vbs"> "" "c:\file1.txt" < "c:\file2.txt" > "file3.txt"