解決済み

vbs csv内の一部の値を連結

  • すぐに回答を!
  • 質問No.9564356
  • 閲覧数166
  • ありがとう数1
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 18% (130/693)

vbsで以下のように編集したいです。
<編集前>
   A     B  C   D   E
1 aaa@aaa.jp 田中 男性 test001 数学
2 bbb@bbb.jp 石田 男性 test002 英語
3 ccc@ccc.jp 佐藤 女性 test003 科学
4 ddd@ddd.jp 伊藤 男性 test004 社会

<編集後>
   A     B      C  D   E   F
1 test001_aaa aaa@aaa.jp 田中 男性 test001 数学
2 test002_bbb bbb@bbb.jp 石田 男性 test002 英語
3 test003_ccc ccc@ccc.jp 佐藤 女性 test003 科学
4 test004_ddd ddd@ddd.jp 伊藤 男性 test004 社会

<編集内容>
D列の値とA列のメールアドレスの「@」の前をアンダースコアを挟み、連結させる。

可能であればコードのご教示宜しくお願い致します。
説明に不備等あればお知らせください。

コードの説明もあれば嬉しいです。

質問者が選んだベストアンサー

  • 回答No.1

ベストアンサー率 42% (200/467)

これから処理したい「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!」と表示しています。
補足コメント
tyarutiru

お礼率 18% (130/693)

ご回答ありがとうございます。
編集前のA列とD列が逆だった場合のコードはどうなりますでしょうか。
D列のメアドは、同じように@の前を連結させる形です。
度々、お手数をおかけします。
投稿日時 - 2018-12-05 10:22:56
お礼コメント
tyarutiru

お礼率 18% (130/693)

補足コメント併せて、ご回答ありがとうございました。
とても理解しやすく、助かりました。
投稿日時 - 2018-12-05 21:17:03
感謝経済

その他の回答 (全1件)

  • 回答No.2

ベストアンサー率 42% (200/467)

「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」、・・・となることが分かって頂ければ、理解しやすいと思います。
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する

特集


感謝指数をマイページで確認!

ピックアップ

ページ先頭へ