[VBscript] csvファイルを編集

このQ&Aのポイント
  • D&DでcsvファイルをD&Dした後、下記のような内容に変更し、保存するコードをご教示頂けないでしょうか。
  • 名前 処理 担当の列名に処理内容の列を追加し、[処理]列の値によって[処理内容]列の値を設定する方法を教えてください。
  • [処理]列に「更新」という値がある場合、[処理内容]列に「更新処理」という値を入れる。[処理]列に「削除」という値がある場合、[処理内容]列に「削除処理」という値を入れる。
回答を見る
  • ベストアンサー

[VBscript] csvファイルを編集

D&DでcsvファイルをD&Dした後、 下記のような内容に変更し、保存する コードをご教示頂けないでしょうか。 <変更前> 名前 処理 担当    田中 更新 製品 佐藤 更新 サービス 伊藤 更新 製品 桜井 削除 サービス <実行後> 名前 処理 担当   処理内容 田中 更新 製品   更新処理 佐藤 更新 サービス 更新処理 伊藤 更新 製品   更新処理 桜井 削除 サービス 削除処理 <csv変更内容> ・[処理]列に「更新」という値がある場合、[処理内容]列に「更新処理」という値を入れる ・[処理]列に「削除」という値がある場合、[処理内容]列に「削除処理」という値を入れる 宜しくお願いします。

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

  • ベストアンサー
  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.1

「更新処理」以外は、「削除処理」しかない、という前提ですが・・・ いったん、「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!」と表示しています。

tyarutiru
質問者

お礼

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

その他の回答 (1)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.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でやっても、ほぼ似たコードで済むと思う。

関連するQ&A

  • vbs csv 編集

    vbsを実行し下記のようにcsvを編集することは可能でしょうか。 ドラッグアンドロップでvbsを実行することとします。 <実行前> A列 B列  C列 名前 性別 出身地 田中 男  北海道 佐藤 女  沖縄 伊藤 女  東京 桜井 男  東京 <実行後> A列 B列  C列  D列   E列 田中 男  北海道 000001 学生 佐藤 女  沖縄  000002 学生 伊藤 女  東京 100000 社会人 桜井 男  東京  100001 社会人 編集箇所としては、 ・一行目を削除し、二行目を先頭にする。 ・D列には000001~999999まで連番で値を追加 ・E列には、D列の値が「~99999」の場合は、学生。  それ以上は、社会人と記載するようにする。 宜しくお願いします。

  • VBScriptでcsvファイルの編集は出来ますか

    プログラミング初心者です。 ネットや本で調べてみたのですが、どうもわからなかった為、 ここに質問を挙げさせていただきました。 今、担当している仕事で、ASPのファイルを作成しています。 機能としては、あるCSVファイル(test.csv)から 列の値を指定し、その値を含んでいる行を検索し、 その行の値をテキストボックスにそれぞれ表示させ修正(他の行の値は変更しない。)、 もしくは選択した行のみの削除(値を無くすのではなく、行自体の削除)を行いたいのです。 (例) ■修正 test.csvの内容が下記のような場合、 国   |  地方  |  都道府県  ++++++++++++++++++++++++++ 日本 |  関東  |  東京 日本 |  東北  |  青森 日本 |  九州  |  福岡 1.「地方」の列から「東北」の行を選択し、それぞれの値をテキストボックスに表示。 2.1で選択した行の都道府県を「秋田」に変更し、上書き。 3.test.csvの内容が下記のように変更されている。 国   |  地方  |  都道府県  ++++++++++++++++++++++++++ 日本 |  関東  |  東京 日本 |  東北  |  秋田 日本 |  九州  |  福岡 ■削除 1.「地方」の列から「関東」の行を選択し、それぞれの値をテキストボックスに表示。 2.1で選択した行を削除し、上書き。 3.test.csvの内容が下記のように変更されている。 国   |  地方  |  都道府県  ++++++++++++++++++++++++++ 日本 |  東北  |  青森 日本 |  九州  |  福岡 ※前提条件として、1つの列内には同じ値は入らないものとします。 いろいろ調べてみて検索、表示は何とかできそうなのですが、 修正や削除の方法がわかりませんでしたので、 お手数をおかけして申し訳ありませんが、ご存知の方がいらっしゃったら 参考になるソースのご教示をお願い出来ますでしょうか。 初心者ということもあり、そもそもこのような機能をASP(VBScript)で行えるのでしょうか? その点についても、教えていただけると嬉しいです。

  • vbcript csvファイルの内容変更

    下記の変更できるコードのご教示頂けますでしょうか。 <実行前> A列 B列  C列 田中 更新  北海道 佐藤    沖縄 <実行後> A列 B列  C列 田中 更新  北海道 佐藤 新規  沖縄 <編集内容> B列に空白があった場合、「新規」と出力する できれば、下記URLのベストアンサーの方のように Buf(i)を利用するようなコードでご教示頂けると嬉しいです。(不可能ならばほかの方法でお願いします) https://okwave.jp/qa/q9552634.html

  • 項目毎に新規CSV形式、ファイル名をつけて保存

    お世話になります。 エクレルの項目毎に新規CSVファイルで、ファイル名をつけて保存したいです。 (1)添付図のようなフォーマットを、D列+CSVで保存を行う。 ・山本株式会社.csv ・佐藤有限会社.csv ・株式会社鈴木.csv ・有限会社田中.csv (2)新規ファイル内容 A列:支店番号(元データのE列) B列:支店名(元データのF列) C列:売上(元データのG列) マクロを使って上記作業は可能でしょうか? どうぞよろしくお願いいたします。

  • vbs csv内の一部の値を連結

    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列のメールアドレスの「@」の前をアンダースコアを挟み、連結させる。 可能であればコードのご教示宜しくお願い致します。 説明に不備等あればお知らせください。 コードの説明もあれば嬉しいです。

  • CSVファイル内の変更について

    CSVファイルの操作でご相談です。 所定のフォルダに出力されるCSVファイルのデータが、例えば「1,2,3,4,5」という配列になっているものを、3番目と4番目の列を削除して「1,2,5」となるように、所定の列を位置の値を削除し上書き(もしくは別ファイルとして作成)したいのですが、何かやり方はございますでしょうか?(例:「赤,青,黄,黒,白」→「赤,青,白」) もしくはこのようなツールはございますでしょうか? できればこのフォルダを監視して、ファイルが作成され次第上記のような処理が自動でされれば一番ありがたいのです。もしくは都度バッチファイルのようなものを動かして上記のような動きになればありがたいです。 お知恵をいただきたく、よろしくお願いします。

  • バッチでcsvファイルの指定のカラムを編集したい

    バッチでファイルの編集をしたい バッチファイルを使用して、csvファイルの読み込み~編集を行いたいと思っております 元ファイル:TEST_DATA.csv 内容: 111,222,333,444,555 123,456,789,321,987 上記のcsvファイルを読み込み、 ・5カラム目が987ならば3カラム目を654に変更する という処理を実行させたいのですが、 どのように行えばよいのでしょうか? 現在考えていることは、 1.for文を使用して指定のカラムを抜く(3カラム目と5カラム目を抜く)) 2.5カラム目の値をif条件に指定し、合致した場合、抜いた3カラム目の変数に654を入れる 3.654に変更した変数を3カラム目の値として入れる という順番で行えばいいと思っているのですが、 下記まで行ったところで行き詰ってしまいました for /F "tokens=3,5 delims=," %%i IN (TEST_DATA.csv) DO @(if %%j==987 set %%i=654 echo %i %j ) お分かりになられる方、ご教授願えませんでしょうか

  • 【PHP】csvファイルへの書き出し(1行追加or1行上書き)について

    【PHP】csvファイルへの書き出し(1行追加or1行上書き)について はじめて利用させていただきます。 現在、PHPにて書き出し処理を作成している者ですが、csvファイルへの書き出しの際に先頭行にスペースが大量に入ってしまい、困っています。 自分なりに調べてみたのですが、原因がわかりません。詳しい方からのアドバイスをお願いしたいです。 【行っている処理】 1.csvファイルを1行ずつ読み込み、配列に格納 2.既存のデータに同じ名前の人が存在する場合は、その行の配列の内容を変更(存在しない場合は配列の末尾に1件追加) 4.現在ファイルにあるデータを削除(丸めこみ)し、配列データを書き書き出し 【ソース】(書き出し処理に問題があると思ったため、それ以外の部分は割愛させていただきます) <?php $filename = 'data.csv'; $file = fopen($filename, "r+" ); $name = array(); if(flock($file,LOCK_SH)){ while( $data = fgetcsv( $file, 1000, "," ) ) {   //配列に格納 } //配列の内容変更or新規に一行追加処理 //現在のファイル内のデータを削除(まるめこみ) ftruncate($file, 0); //1行分のデータをカンマ区切りで結合し、書き出し for($i = 0; $i < $count; $i++){ $ins = $name[$i]; $ins .= ','; $ins .= $number[$i]; //書き込み失敗時のエラー if(fwrite($file, "$ins\n" ) === FALSE){ print("ファイル書き込みに失敗しました"); }else{ //処理なし } } //ファイルロック解除 flock($file, LOCK_UN); }else{ print("ファイルロックに失敗しました"); } 【csvファイルの中身(処理実行前)】 佐藤,1234 田中,12345 中村,9876 【csvファイルの中身(処理実行後)】                       佐藤,1234 田中,12345 中村,9876 以上です。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • Excel(csv)の自動編集

    Excelまたはcsvの自動編集について教えてください。 仕事で、システムで作成した見積をcsvで出力し編集する業務があるのですが、 出力後いつも同じ要領で手動で編集を行っております。 これを自動でできるようにならないかと思っております。 csvのままでは厳しいようでしたら、Excelで一度保存しなおし、 自動編集が実現できるようにする形でもいいかなと思っております。 こちらの実現方法を教えていただけないでしょうか。 具体的な内容といたしましては、 10行×10列くらいのデータの中で、 ・B列とD列、G列を削除 ・H列とI列の間に空白列を追加 ・すべてのフォントサイズを9ptに ・できたデータを表にするため、枠線を追加 ・F列は金額が入力されるため、桁区切りの「,」を書式に設定 上記の中で自動で実現できる内容を、ワンクリックで実行するためには、 どういう作業が必要でしょうか。。 そもそも自動でできるんでしょうか。。。

  • VBAでcsvファイルを読み込み、更新する方法

    こんにちは。早速ですが、質問です。 VBAを使ってcsvファイルをエクセルに読み込んで、 読み込んだエクセル上でcsvファイル情報を変更すると、 変更した内容が読み込み元のcsvファイルに更新される ようなプログラムを作りたいのです。csvファイルの 読み込みまではうまくいったのですが、csvファイルの 更新の仕方がわかりません。良い方法があれば、 教えてください。よろしくお願いします。