3

たとえば、=CONCATENATE 関数を使用して多数の列を 1 つの列にマージすることで、Excel 内でこれを行うことができます。しかし、私がやりたいのは、同じフォルダー内の 3 つの異なる csv ファイル内の列を 1 つの列にマージすることです。これをバッチ スクリプトで実行したいので、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: インデックス
  • コラム4:よくある質問

File3.csv

  • 列 1: .html
  • 列 2: .html
  • 列 3: .html
  • 列 4: .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

ご協力いただきありがとうございます。

4

3 に答える 3

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. /r "."file1 の場合、FINDSTR は、任意の文字 ( ) の前に行番号とコロン ( )を含む行を「出力」します/n。この「出力」は によって読み取られFOR /f、コロンで区切られた 2 つのトークンに解析されます ( tokens=1*「最初のトークン; 行の残りのすべて」を意味します)。その結果、行番号と行の残りの部分が挿入%%aされます。 、これは元から.csvへの行です%%b
  2. FOR EACH LINE csv1for Repeat for csv2、今回は行番号を に%%c、行を%%d
  3. 行番号が一致する場合のみcsv3、番号%%eを入力してテキストを入力して繰り返します%%f
  4. この最後のファイルの行番号が一致する場合は、それぞれの行テキストを解析し、今回%%bはコンマで区切られた 4 つの列を選択します。このデータは.. 、.. 、..で表示されます。あとは、適切な部分を突き合わせてコンマを挿入するだけです。%%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
=============
于 2013-03-23T11:37:33.933 に答える
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
于 2013-03-23T15:40:16.130 に答える
0

実際にはプログラミングではありませんが、簡単で汚い方法は、Excel ですべてのファイルを開き、新しいXLSまたはXLSXファイルを作成してから、新しく作成したファイルの最初のセルで次の式を使用することです。

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

ここFile1.csvで、、、File2.csvおよびFile3.csvは CSV ファイルです。次に、列/行をドラッグして数式を適用します。

于 2013-03-23T11:14:24.160 に答える