• ベストアンサー

vbcript csvファイルの内容変更

Prome_Linの回答

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

ドラッグ&ドロップしたファイルと同じフォルダに、いったん、「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) Do Until cv.AtEndOfStream a = Split(cv.ReadLine, ",") If a(1) = "" Then a(1) = "新規" End If dm.WriteLine Join(a, ",") 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") ファイルやフォルダ、テキストファイルを扱う「Windows」の機能を読み込んでいます。 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) 「読み込み専用」(=「1」)で開いています。 Set dm = so.OpenTextFile(f & "\Dummy.csv", 2, True) 同じフォルダ内に「Dummy.csv」ファイルを、「書き込み専用」(=「2」)で、「新規作成を許可」(=「True」)しています。 Do Until cv.AtEndOfStream ファイルの終端まで処理。 a = Split(cv.ReadLine, ",") 1行読み込み、区切り記号を使って配列変数に格納しています。 「Split()」は、配列変数に格納する関数です。 今回は「csv」ファイルということで、区切り記号は「,」ですから「Split(x, ",")」というように「,」を区切り記号として読み込みます。 そして、読み込んだ1行が、たとえば「a,b,c」の場合、「a(0) = "a"」、「a(1) = "b"」、「a(2) = "c"」となります。 If a(1) = "" Then a(1) = "新規" End If 2番目の項目が「空白」なら2番目の中身を「新規」にしています。 dm.WriteLine Join(a, ",") 「Dummy.csv」に書き出していますが、「Join()」は、「Split()」と逆のことをします。 すなわち「a(0) = "a"」、「a(1) = "b"」、「a(2) = "c"」なら「Join(a, ",")」で、「a,b,c」とします。 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 ファイル名を、元のドラッグ&ドロップされたファイルと同じにしています。 End If Next を、ドラッグ&ドロップされたファイルの数だけ繰り返しています。 Set wa = Nothing Set so = Nothing 「Set ~」で使った変数は、その使用後「Nothing」で解放しておきます。 MsgBox("Finished!") いつ終わったか、分かりにくいので、最後に「Finished!」と表示しています。

関連する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ファイルを編集

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

  • ExcelへのCSVファイルの取り込み

    当方のExcelの環境は、Excel 2003/2007/2010 が混在しています。 CSVファイルをExcelに取り込んだ際、各セルへ下記のような当方の意図した形式で取り込む方法をご教示頂きたくお願い致します。 下記のようなダブルクォーテーション( " )で囲まれたカンマ( , )区切りのCSVファイルがあるとします。 ※[改行]の部分は、実際には改行コードが入っています。 ※[スペース]の部分は、実際には半角/全角スペースのいずれかが入っています。 "登録番号","登録名","登録内容","部署コード" "0001","山田一郎","・テスト[改行][スペース][スペース]ホゲホゲ,"01" "1002","鈴木次郎","・テスト2","10" "0102","佐藤三郎","","10" このファイルをExcelで開くと、A1~D4の各セルに下記の内容で表示されます。 =========== A1セル:登録番号 B1セル:登録名 C1セル:登録内容 D1セル:部署コード A2セル:1 B2セル:山田一郎 C2セル:・テスト       ホゲホゲ D2セル:1 A3セル:1002 B3セル:鈴木次郎 C3セル:・テスト2 D3セル:10 A4セル:102 B4セル:佐藤三郎 C4セル: D4セル:10 =========== これを下記のようにA2やD2、A4セルの数字部をデータ通りに表示したいです。 =========== A1セル:登録番号 B1セル:登録名 C1セル:登録内容 D1セル:部署コード A2セル:0001 B2セル:山田一郎 C2セル:・テスト       ホゲホゲ D2セル:01 A3セル:1002 B3セル:鈴木次郎 C3セル:・テスト2 D3セル:10 A4セル:0102 B4セル:佐藤三郎 C4セル: D4セル:10 =========== データの取り込みにて区切り文字を"カンマ"にして、A列やD列を"文字列"として読み込む事を考えましたが、「登録内容」の部分に改行が入っている為、下記のように改行後の文字列がA列に入ってしまい、意図した内容での表示が出来ません。 =========== A1セル:登録番号 B1セル:登録名 C1セル:登録内容 D1セル:部署コード A2セル:0001 B2セル:山田一郎 C2セル:・テスト D2セル: A3セル: ホゲホゲ" B3セル:1 C3セル: D3セル: A4セル:1002 B4セル:鈴木次郎 C4セル:・テスト2 D4セル:10 A5セル:0102 B5セル:佐藤三郎 C5セル: D5セル:10 =========== A列、D列は文字列の状態で読み込みつつ、C列の改行は当該セル内で実行する方法をご教示頂きたくお願い致します。

  • エクセルの検索機能について

     エクセルの詳しい方に質問です。  まず下記のようなデータがあります。  A列  B列  安部  10  佐藤  20  佐藤  30  佐藤  25  田中  10  このデータをもとに下記のような表をつくりたく思っています。  A列  B列  C列  D列  安部  10  佐藤  20   30   25  田中  10 なお、A列はこちらで入力し、B列~D列に式を入力しておき自動計算するようにしたいのです。 わかる方のお力添えをよろしくお願いします。  

  • EXCELマクロVBAについて

    Excel2007、XPを使用しています。 AからE列に下記のような情報が入力されています。 A / B / C / D / E ID / 名前 / 住所 / 電話 / 注文日 11111 / 田中 / 東京都 / 00000000000 / 2012/08/10 11111 / 田中 / 東京都 / 00000000000 / 2012/08/09 11111 / 田中 / 東京都 / 00000000000 / 2012/08/18 11112 / 佐藤 / 京都府 / 00000000000 / 2012/08/10 11113 / 鈴木 / 北海道 / 00000000000 / 2012/08/11 11113 / 鈴木 / 北海道 / 00000000000 / 2012/08/15 A列のIDでくくったとして、 E列の注文日が最大のみの行を表示させたいです。 A / B / C / D / E ID / 名前 / 住所 / 電話 / 注文日 11111 / 田中 / 東京都 / 00000000000 / 2012/08/18 11112 / 佐藤 / 京都府 / 00000000000 / 2012/08/10 11113 / 鈴木 / 北海道 / 00000000000 / 2012/08/15 このようなことはマクロで可能なのでしょうか? 恐れ入りますがご教授お願い致します。

  • excel2003 2列のデータを1列に

    エクセル2003にて 下記のように2列のデータを1列に表示させたいと思っております。 A列  B列              C列 田中 佐藤              田中 鈴木 池田 このように>      鈴木 後藤 内藤              後藤                     佐藤                     池田                     内藤 C列に入れる数式をお教えください。 よろしくお願いします。

  • エクセルのデータ並べ替え(抽出)の方法

    エクセルのデータ並べ替え(抽出)の方法 を教えてください。 下記のようなデータがあるとします。   A    B    C   D 1 田中  東京  千葉  福岡 2 山田  京都  滋賀 3 佐藤  奈良  青森  USA 4 鈴木  カナダ 愛媛 A列は名前、B列以降は文字列です。B列以降はC列までの行、D列までの行とさまざまです。重複セルはありません。 これを下記のように並べ替えたいです。   A    B    C   D 1東京  田中 2千葉  田中 3福岡  田中 4京都  山田 5滋賀  山田 6奈良  佐藤 7青森  佐藤 8USA   佐藤 9カナダ 鈴木 10愛媛  鈴木 こういうことは可能でしょうか??? 教えてください。 よろしくお願いします。

  • エクセルでひもづいて表示させるには

    エクセルで、シート1とシート2をつくり、シート2には、 A  B   C 1  佐藤 5214 2  田中 3562 3  木村 2235 という、番号と名前、コードを表にします。 シート1のA列に「1」(番号)を入れると、B列にそれにひもづいた「名前」、C列に同じく「コード」を表示させるには、どうすればよいでしょうか。 よろしくお願いいたします。

  • エクセルで、2つの列を比較して判定する方法。。。

    宜しくお願いします。 2つの列を比較して、判定結果を表示させる方法はないでしょうか? 例えば A         B 田中      加藤 佐藤      志村 吉田      吉田  のような列があった場合、 A列の文字がB列にもあった場合は1 A列の文字がB列になかった場合は0 をかえす式は作れないでしょうか? A         B     C 吉田      加藤     1(”吉田”はB列にあるので1)  佐藤      志村     0(佐藤はB列にないので0) 田中      吉田     0(田中はB列にないので0) やり方を教えてください。 宜しくお願いします。

  • エクセルシート間の照合について

    エクセルシート間で照合をしたいと思っています。 照合する項目は2つ。2つともあえばそのA列のデータを表示するというものです。 データは シート1(前年) A  B  C  D 1  田中 123 東京都・・ 5  佐藤 124 千葉県・・ 3  山本 128 埼玉県・・ シート2(今年) A  B  C  D   山本 128 埼玉県・・   佐藤 124 北海道・・   田中 123 東京都・・ C列とD列を照合し2つともあえばシート2のA列にシート1のA列のデータを入力する。なければ「なし」と入力できるようにしたいのです。 上の場合は山本のA列に「3」佐藤には「なし」田中には「1」と入るのうになればと思います。 入力されている列は同じですが順番はばらばらです。データ数は1万件を超えています。 どなたかアドバイスいただければと思います。よろしくお願いします。