こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

[VBscript] csvファイルを編集

D&DでcsvファイルをD&Dした後、
下記のような内容に変更し、保存する
コードをご教示頂けないでしょうか。
<変更前>
名前 処理 担当   
田中 更新 製品
佐藤 更新 サービス
伊藤 更新 製品
桜井 削除 サービス

<実行後>
名前 処理 担当   処理内容
田中 更新 製品   更新処理
佐藤 更新 サービス 更新処理
伊藤 更新 製品   更新処理
桜井 削除 サービス 削除処理

<csv変更内容>
・[処理]列に「更新」という値がある場合、[処理内容]列に「更新処理」という値を入れる
・[処理]列に「削除」という値がある場合、[処理内容]列に「削除処理」という値を入れる

宜しくお願いします。

投稿日時 - 2018-11-06 23:09:27

QNo.9555249

すぐに回答ほしいです

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

「更新処理」以外は、「削除処理」しかない、という前提ですが・・・

いったん、「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!」と表示しています。

投稿日時 - 2018-11-07 07:20:43

お礼

ご回答ありがとうございます。
わざわざコードのご説明していただき、
ありがとうございました。

投稿日時 - 2018-11-07 22:51:51

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

エクセル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でやっても、ほぼ似たコードで済むと思う。

投稿日時 - 2018-11-07 10:53:23

あなたにオススメの質問