- ベストアンサー
vbs csv内の一部の値を連結
- vbsでcsv内の一部の値を連結する方法について教えてください。
- 具体的には、D列の値とA列のメールアドレスの@の前をアンダースコアで連結させたいです。
- 連結後の結果は、新たにF列に表示するようにしたいです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
これから処理したい「csv」ファイルをプログラムファイルにドラッグ&ドロップしてください(複数可)。 ドラッグ&ドロップしたファイルが存在するフォルダに、たとえば「abc.csv」なら「abc(Result).csv」という結果ファイルを作成します。 Option Explicit Dim a, b, cr, cv, f, i, n, so, wa Set so = CreateObject("Scripting.FileSystemObject") Set wa = WScript.Arguments For i = 0 to wa.Count - 1 If LCase(so.GetExtensionName(wa(i))) = "csv" Then f = so.GetParentFolderName(wa(i)) n = so.GetBaseName(wa(i)) Set cv = so.OpenTextFile(wa(i), 1) Set cr = so.OpenTextFile(f & "\" & n & "(Result).csv", 2, True) Do Until cv.AtEndOfStream a = Split(cv.ReadLine, ",") b = Split(a(0), "@") cr.WriteLine a(3) & "_" & b(0) & "," & Join(a, ",") Loop cv.Close cr.Close Set cv = Nothing Set cr = Nothing End If Next Set wa = Nothing Set so = Nothing MsgBox("Finished!") 簡単な説明です。 Option Explicit 「厳密に」とか「明確に」というような意味で、このオプションを設定すると、変数は、その使用の前に「Dim」等によって宣言しておかなければなりません。 Set so = CreateObject("Scripting.FileSystemObject") ファイルやフォルダ、テキストファイルを扱えるようにしています。 Set wa = WScript.Arguments ドラッグ&ドロップされるのを待っています。 For i = 0 to wa.Count - 1 ドラッグ&ドロップされたファイルを1つずつ、すべて処理します。 ドラッグ&ドロップされたファイルは「wa(0)」、「wa(1)」、「wa(2)」、・・・に入ります。 ドラッグ&ドロップされたファイルの数は「wa.Count」で分かります。 「wa.Count」は、「1」から始まりますが、実際のファイルは「wa(0)」と「0」から始まるので、「For i = 0 to wa.Count - 1」というように「- 1」しています。 If LCase(so.GetExtensionName(wa(i))) = "csv" Then 「LCase()」は、英字を半角に変換する関数です。 これで、「Csv」でも「CSV」でも、すべて「csv」になります。 「so.GetExtensionName()」は、「Scripting.FileSystemObject」の機能を使って(頭の「so.」)、ファイルの拡張子を取得します。 すなわちここは、「もし拡張子がcsvなら」となります。 f = so.GetParentFolderName(wa(i)) ドラッグ&ドロップされたファイルが存在するフォルダを調べています。 n = so.GetBaseName(wa(i)) ドラッグ&ドロップされたファイルのベースネーム(「abc.csv」→「abc」)を調べています。 Set cv = so.OpenTextFile(wa(i), 1) ドラッグ&ドロップされたファイルを「読み込み専用」(=「1」)で開いています。 Set cr = so.OpenTextFile(f & "\" & n & "(Result).csv", 2, True) 同じフォルダ内に「abc.csv」なら「abc(Result).csv」という名前で、「書き込み専用」(=「2」)で、「新規作成を許可」(=「True」)しています。 Do Until cv.AtEndOfStream ファイルの終端まで繰り返します。 a = Split(cv.ReadLine, ",") 「Split()」は、区切り記号を指定して、配列変数に格納する関数です。 たとえば、読み込んだ1行が「a,b,c」なら「a(0) = "a"」、「a(1) = "b"」、「a(2) = "c"」となります。 b = Split(a(0), "@") 実際のデータでは、「a(0)」は「aaa@aaa.jp」ですから、今度は、「,」ではなく「@」を区切り記号として配列変数に格納しています。 すなわち、「b(0) = "aaa"」、「b(1) = "aaa.jp"」となります。 cr.WriteLine a(3) & "_" & b(0) & "," & Join(a, ",") まず、「a(3)」(=「test001」)+「_」+「aaa」という文字列を作成し、「,」で接続し、最初に読み込んだ配列変数を「,」でつないでいます。 「Join(a, ",")」は、「a」という配列変数の値を「,」でつなぐ関数です。 Loop を、ファイルの終端まで繰り返しています。 cv.Close cr.Close Set cv = Nothing Set cr = Nothing 両ファイルを閉じています。 End If Next を、ドラッグ&ドロップされたファイルの数だけ繰り返しています。 Set wa = Nothing Set so = Nothing 「Set ~」で使った変数は、その使用後、「Nothing」で解放しておきます。 MsgBox("Finished!") いつ終わったか分かりにくいので、最後に「Finished!」と表示しています。
その他の回答 (1)
- Prome_Lin
- ベストアンサー率42% (201/470)
「test001_aaa」とすることは変わりがないのでしたら、13・14行目の b = Split(a(0), "@") cr.WriteLine a(3) & "_" & b(0) & "," & Join(a, ",") を b = Split(a(3), "@") cr.WriteLine a(0) & "_" & b(0) & "," & Join(a, ",") にするだけです。 配列変数の添え字(「()」)内の数字に着目してください。 列「A」が「0」、列「B」が「1」、・・・となることが分かって頂ければ、理解しやすいと思います。
お礼
補足コメント併せて、ご回答ありがとうございました。 とても理解しやすく、助かりました。
補足
ご回答ありがとうございます。 編集前のA列とD列が逆だった場合のコードはどうなりますでしょうか。 D列のメアドは、同じように@の前を連結させる形です。 度々、お手数をおかけします。