• ベストアンサー

vbs csvファイル内の行を変更

vbsにて、csvファイルを読み込み、 以下のように行の値を変更することは可能でしょうか。 変更箇所は1行目です。 <元csvファイル> 氏名 性別 年齢  <変更後csvファイル> フルネーム 男女 年 住所 電話番号 コードのご教示お願いいたします。

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

  • ベストアンサー
  • watabe007
  • ベストアンサー率62% (476/760)
回答No.1

D&Dでお試しください。 Option Explicit Dim objArgs, Fso, Arg, buf, FilePath Set objArgs = WScript.Arguments Set Fso = CreateObject("Scripting.FileSystemObject") If objArgs.Count < 1 Then WScript.Quit For Each Arg In objArgs FilePath = Arg With Fso.OpenTextFile(FilePath) .SkipLine '1行スキップ buf = .ReadAll .Close End With With FSO.OpenTextFile(FilePath, 2) .WriteLine "フルネーム,男女,年,住所,電話番号" .Write buf .Close End With Next

tyarutiru
質問者

お礼

補足コメントですが、2行目以降に値が入っていなかったためエラー蜷田みたいです。 コードのご教示ありがとうございました。 また、Prome_Linさん、コードの説明ありがとうございました。

tyarutiru
質問者

補足

ご回答ありがとうございます。 試してみましたが、以下のエラーが出ます。 エラー:「ファイルの最後を超えた入力を行おうとしました。」 原因と解決法をご教示頂けますでしょうか。

その他の回答 (1)

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

私は、「watabe007さん」のプログラムの説明だけですので、ベストアンサーは必ず、「watabe007さん」にお願いします。 Option Explicit 「厳密に」とか「明確に」というような意味で、このオプションを設定すると、変数は、その使用の前に、必ず、「Dim」等によって、宣言しておかなければなりません。 Set objArgs = WScript.Arguments ドラッグ&ドロップされるのを待っていて、ドラッグ&ドロップされたものは「objArgs」に入ります。 たとえば、3つファイルをドラッグ&ドロップした場合、「objArgs(0)」、「objArgs(1)」、「objArgs(2)」にそれぞれのファイルの情報が入ります。 「MsgBox(objArgs(0)」などとすると、ドラッグ&ドロップしたファイルのフルパス(たとえば「D:\Programming\Sample.csv」などと表示します。 あたかも、配列変数のように見えますが、配列変数ではなく、ある意味、ドラッグ&ドロップしたファイルそのものですので、「objArgs(0)」の内容を変更することは出来ません。 Set Fso = CreateObject("Scripting.FileSystemObject") ファイルやフォルダを扱うまた、テキストファイルを扱う「Windows」の機能を読み込んでいます。 If objArgs.Count < 1 Then WScript.Quit 1つもドラッグ&ドロップしていなければ、プログラムそのものを終了してしまいます「objArgs.Count」がドラッグ&ドロップしたファイルの数、「WScript.Quit」がプログラムの強制終了です)。 For Each Arg In objArgs ドラッグ&ドロップしたものを1つずつ処理します。 FilePath = Arg 見つかったファイルを「FilePath」という変数に入れています。 With Fso.OpenTextFile(FilePath) テキストファイルとして開いています(より明確にするのでしたら、「Fso.OpenTextFile(FilePath, 1)」として、「読み込み専用」であることをしてしますが、指定しなければ、「読み込み専用」ですので問題ありません)。 以後、「.~」で「Fso.OpenTextFile(FilePath).~」と記述しているのと同じになります。 .SkipLine '1行スキップ もちろん、「1行読み飛ばし」です。 buf = .ReadAll 「ReadAll」ですから、一気に全部読み込んでいますが、最初1行読み飛ばしていますので、最初の1行目は含みません。 .Close ファイルを閉じています。 End With ここまで「With Fso.OpenTextFile(FilePath)」が有効です。 With FSO.OpenTextFile(FilePath, 2) もう一度、同じファイルを今度は、「2」ですから「書き込み専用」で開いています。 この時点で、ある意味、元のファイルは消えて無くなり、新規に作成したのと同じになります。 .WriteLine "フルネーム,男女,年,住所,電話番号" 1行目のデータを書き込んでいますが、「WriteLine」ですから、最後に「改行」が入ります。 .Write buf 最初に読み込んだ分を書き込んでいますが、今度は、「Write」です。 これは、最初に読み込んだデータがすでに改行などもすべて含んでいるので、「WriteLine」で改行してはよけいな改行が入ってしまうからです。 .Close ファイルを閉じています。

関連するQ&A

  • vbs xlsをcsvに変換

    vbsでxlsファイルをcsvファイルに変換することは可能でしょうか。 手動で拡張子をcsvにすると、カンマ区切りではないため 一列目にすべての値がスペース区切りで出力されてしまいます。 vbsで実行可能でしたらコードのご教示頂けますでしょうか。

  • CSV形式のファイル名をCSVの先頭に入れる方法

    EXCEL CSV形式のファイル名をCSVファイルの先頭に入れるたいのですが,EXCELのマクロやBVなどで簡単にできるよい方法はないでしょうか。 例えば, ファイル名:  123_001.csv 123_001.csvの内容:  氏名,年齢  山田,25歳    ↓ の123_001.csvを  コード,氏名,年齢  123_001,山田太郎,25歳 というデータにしたいのです。 できれば,フォルダ内に保存されているCSVファイルを一括で処理したいのですが...。 例) 123_001.csvの内容:  氏名,年齢  山田,25歳 123_002.csvの内容:  氏名,年齢  吉田,30歳 123_003.csvの内容:  氏名,年齢  鈴木,50歳    ↓ 123_001.csvの内容:  コード,氏名,年齢  123_001,山田,25歳 123_002.csvの内容:  コード,氏名,年齢  123_002,吉田,30歳 123_003.csvの内容:  コード,氏名,年齢  123_003鈴木,50歳 よろしくお願いします。

  • CSVファイルの行が突然消える

    あるデータを抽出し、それをCSVファイルで取り込み、1つ取り込む ごとにCSVファイルが1行ずつ増えていきます。 適当な時期に、何行かたまった行を一気にAccessを用いてさらに取り込み ます。(取り込むのみ) あるとき、CSVファイルを開くと突然CSVファイルの行が減って いるのです。 何が起きているのでしょうか? Accessに何かマクロとか組んであって突然消えるのでしょうか? Accessを開く前と開いた後(取り込んだ後)で、特にCSVファイル に変更はありません。 あるとき突然CSVファイルを開くと昨日まであった行が突然 消えてしまうのです。(いつ起こるのか予測できていません。) CSVファイルにはマクロが組んであるようには見えません。 何かわかればお願いします。

  • vbs csv 編集

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

  • 【windowsバッチ】CSVの編集

    とあるCSVファイル(先頭行はヘッダー項目)において、個人コード(先頭列)に文字列を含むレコードを除外したいです。 (個人コードに文字列を含まないレコードを読み込んで、新たにCSVファイルを作成でも可) 出来ればVBS等は用いず、バッチのみで行いたいのですが… 恐れいりますが、どなたかご教示いただけますでしょうか。 よろしくお願いいたします。

  • PHPでCSVファイルを編集したい

    PHPを触りだして間もない者です。 PHPでCSVファイルを編集したいのですが、上手くいきません。 CSVファイルの中身は{商品番号,名前,住所,年齢}が数行入力されています。 具体的にはPHPで引数の商品番号を基にCSVファイルで編集する行数を決定して、その行の一部項目を変更したいのですが、良い方法はありますでしょうか?

    • 締切済み
    • PHP
  • VBSとCSVによるテキストデータの操作について

    識者の皆様、いつも参考にさせていただきありがとうございます。 VBSによるテキストファイルの操作についてお伺いします。 ファイルAにCSVのヘッダー行があり、ファイルBにCSVヘッダーとデータがあります。ファイルBにあるヘッダーはファイルAのヘッダーと部分で一致します。このとき出力先ファイルCで、ファイルAのヘッダーを持ち、ファイルBのデータを一致するデータ列にもったCSVを作成したいです。 具体例を出すと、  ファイルAは1行目に Header1,Header2,Header3,Header4,Header5 のヘッダーのみをもちます。 ファイルBの1行目  Header1, Header4,Header5 ファイルBの2行目 ABC,DEF,GHI のように、一部のヘッダーとそれに対応するデータがあります。 VBSで処理後の出力先ファイルCは ファイルCは1行目に Header1,Header2,Header3,Header4,Header5 ファイルCは2行目に ABC,,,DEF,GHI のようにしたいです。 VBSで例示などいただけると幸いでございます。

  • フォルダ内の複数ファイルから抽出(vbs)

    web のログファイルの集計のため、以下が可能なコードを教えていただきたい。 そのまま使えるコードですと非常に助かります。 (vbs または vba) logというフォルダに、複数のログファイルが入っています。 ファイルの文字コードは、UTF8  改行は、LFです。 この複数のファイルから、特定の文字列の入っている行を抜き出して、 1つのCSVファイルに書き出したい。(文字コードをShift-Jis 改行は、CRLFに変えたい) どうかお助けください。宜しくお願いいたします。

  • 【PHP】CSVファイルの特定行を書き出す

    PHPでCSVファイルを読み込み、特定行のみを別のCSVファイルに書き出したいと思います。 作りたいものは、 http://example.com/file.php?repert=5 とすると、「002.csvファイルの5行目のみ」を「003.csv」に書き込むというものです。 下記で作りましたが、 Parse error: syntax error, unexpected end of file in C:\xampp\htdocs\file.php on line 32 になります。 指摘された32行は ?> の行です。 ググると改行コードのトラブルのようでしたのでCR+LF CR LF と試しましたが、改善されません。 どこが不味いかご教示戴けませんでしょうか? 宜しくお願い致します。 <?php $repeat = $_GET['repert']; $inFile = '002.csv'; // 抽出元ファイル $outFile = '003.csv'; // 結果ファイル $inFp = fopen($inFile, 'rb'); $outFp = fopen($outFile, 'w'); while ($data = fgetcsv($fp, 10000)) { if ($count == $repeat) { { $outLineArray = array( 0 => $data[0], 1 => $data[1], 2 => $data[2] ); fputs($outFp, implode(",", $outLineArray) . ""); } } fclose($inFp); fclose($outFp); exit(); ?>

    • 締切済み
    • PHP
  • 読込んだファイルの1行分削除したい

    氏名A 年齢 性別 出身 氏名B 年齢 性別 出身 氏名C 年齢 性別 出身  :  : というような内容のファイルを読込み、 指定した氏名の行(レコード)を全部削除するには、 どのような方法があるでしょう? /* ここから */ FILE *fp; char NAME[20]; /* 氏名 */ char AGE[3]; /* 年齢 */ char SEX[8]; /* 性別 */ char FROM[15]; /* 出身 */ char de][20]; /* 削除する氏名のレコード */ fp = fopen(FNAME, "r+"); if (fp == NULL) { __fprintf(stderr, "次のファイルが開けません: %s\n", FNAME); __return -1; } printf("削除するデータの氏名: "); gets(del); /* 検索氏名取得 */ /* ここまで */ ここまで考えたのですが、この後どうしていいのか分かりません。 環境 WinXP / Borland C++

専門家に質問してみよう