- ベストアンサー
[VBscript] csvファイルを編集
- D&DでcsvファイルをD&Dした後、下記のような内容に変更し、保存するコードをご教示頂けないでしょうか。
- 名前 処理 担当の列名に処理内容の列を追加し、[処理]列の値によって[処理内容]列の値を設定する方法を教えてください。
- [処理]列に「更新」という値がある場合、[処理内容]列に「更新処理」という値を入れる。[処理]列に「削除」という値がある場合、[処理内容]列に「削除処理」という値を入れる。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
「更新処理」以外は、「削除処理」しかない、という前提ですが・・・ いったん、「Dummy.csv」というファイルに結果を書き込みながら処理しています。 最後に、元ファイルを削除して、「Dummy.csv」のファイル名を元のファイルのファイル名に直しています。 Option Explicit Dim a, cv, dm, f, i, m, 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)) Set cv = so.OpenTextFile(wa(i), 1) Set dm = so.OpenTextFile(f & "\Dummy.csv", 2, True) a = cv.ReadLine dm.WriteLine a & ",処理内容" Do Until cv.AtEndOfStream a = cv.ReadLine If InStr(a, "更新") > 0 Then dm.WriteLine a & ",更新処理" Else dm.WriteLine a & ",削除処理" End If Loop cv.Close dm.Close Set cv = Nothing Set dm = Nothing n = so.GetFileName(wa(i)) so.DeleteFile wa(i), True Set m = so.GetFile(f & "\Dummy.csv") m.Name = n 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 ドラッグ&ドロップされたファイルの数だけ処理。 If Lcase(so.GetExtensionName(wa(i))) = "csv" Then 「LCase()」は、英字を半角にする関数ですので、「Csv」や「CSV」の場合も、すべて「csv」になります。 「so.GetExtensionName()」は、「Scripting.FileSystemObject」の機能を使って(頭の「so.」)、拡張子を取得します。 したがって、ここは、「拡張子がcsvなら」となります。 f = so.GetParentFolderName(wa(i)) そのファイルが存在するフォルダを調べています。 Set cv = so.OpenTextFile(wa(i), 1) 「csv」ファイルを「読み込み専用」(=「1」)で開いています。 Set dm = so.OpenTextFile(f & "\Dummy.csv", 2, True) 同じフォルダ内に「Dummy.csv」ファイルを「書き込み専用」(=「2」)で、「新規作成を許可」(=「True」)しています。 a = cv.ReadLine 1行読み込んでいます。 dm.WriteLine a & ",処理内容" 「,処理内容」を後ろに付け加えて、「Dummy.csv」に書き出しています。 Do Until cv.AtEndOfStream ファイルの終端まで処理。 a = cv.ReadLine 1行読み込んでいます。 If InStr(a, "更新") > 0 Then もし、その1行に「更新」という文字が存在したら、 dm.WriteLine a & ",更新処理" 「Dummy.csv」に「,更新処理」を付け加えて書き出しています。 Else それ以外の場合は、 dm.WriteLine a & ",削除処理" 後ろに、「,削除処理」を付け加えて書き出しています。 End If Loop を、ファイルの終端まで繰り返しています。 cv.Close dm.Close Set cv = Nothing Set dm = Nothing 両ファイルを閉じています。 n = so.GetFileName(wa(i)) ドラッグ&ドロップされたファイルのファイル名を調べています。 so.DeleteFile wa(i), True ドラッグ&ドロップされたファイルを削除しています。 Set m = so.GetFile(f & "\Dummy.csv") 「Dummy.csv」をゲット(「取得」)しています。 m.Name = n 「Dummy.csv」を、ドラッグ&ドロップされたファイルのファイル名に変更しています。 End If Next を、ドラッグ&ドロップされたファイルの数だけ処理しています。 Set wa = Nothing Set so = Nothing 「Set ~」で使った変数は、「Nothing」で解放しておきます。 MsgBox("Finished!") 最後に、いつ終わったか分かりにくいので、「Finished!」と表示しています。
その他の回答 (1)
- imogasi
- ベストアンサー率27% (4737/17069)
エクセルVBAでやれば、もう少し簡単になると思ってやってみた。 例データ メモ帳で開いてみた場合に、下記のようなデータを作った。 名前,処理,担当 田中,更新,製品 佐藤,更新,サービス 伊藤,更新,製品 桜井,削除,サービス ーー エクセルのブックの標準モジュールに (下記でXXの部分はユーザー名。) Sub test20() Open "C:\Users\XX\Documents\例1107.csv" For Input As #1 Open "C:\Users\XX\Documents\例1107o.csv" For Output As #2 While Not EOF(1) Line Input #1, t 'MsgBox t s = Split(t, ",") 'MsgBox s(1) & "-->" & s(1) & "処理" Print #2, t & "," & s(1) & "処理" Wend Close #1 Close #2 End Sub 確認用のMsgBox行を除いて10行。 ーーー 結果 CSVファイルで 名前,処理,担当 ,処理処理 田中,更新,製品,更新処理 佐藤,更新,サービス,更新処理 伊藤,更新,製品,更新処理 桜井,削除,サービス,削除処理 原データの見出しの第1レコードがおかしいので、結果の第1レコードが不自然だが。 ーー VBSCRIPTでも、SPLIT関数は使えるので、 https://www.kanaya440.com/contents/script/vbs/function/string/split.html VBScriptでやっても、ほぼ似たコードで済むと思う。
お礼
ご回答ありがとうございます。 わざわざコードのご説明していただき、 ありがとうございました。