VBScriptでのファイル読込について

このQ&Aのポイント
  • VBScriptを使用してCSVファイル内のデータをキー項目(コード)ごとに分け、別のCSVファイルに出力する方法について詳しく教えてください。
  • VBScriptでのファイル読込時の文字コードの指定方法や、CSVファイル内のデータのソート処理について教えてください。
  • VBScriptを使ってCSVファイルを読み込む際に、文字コードの指定やデータのソート方法に関する情報を教えてください。
回答を見る
  • ベストアンサー

VBScriptでのファイル読込について

CSVファイル内のデータをキー項目(コード)ごとに分け、 それぞれ別のCSVファイルに出力しようとしています。 使用する言語はVBSです。 CSVファイルは以下のような形式です。 連番,コード,フラグ,日付 1,0001,A,20091001 2,0002,A,20091001 3,0002,U,20091002 4,0001,D,20091003 CSVファイルは既定の文字コード(UnicodeBE BOMなし)の形式であり、 通常のファイルを読み込むような処理では正しく 読み込むことが出来ませんでした。 (OpenTextFileメソッドの第4引数にUnicodeBEは指定できないのでは…?) また、CSVファイル内のデータは"コード"でソートされておらず、 VBSではソート機能を標準で持っていないため そちらについても実装する必要があります。 ファイルを取り込む際の文字コードの指定や ソート処理について詳しい方、ご回答よろしくお願いします。

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

  • ベストアンサー
  • kztk
  • ベストアンサー率53% (59/110)
回答No.1

Scripting.FileSystemObjectではなく、ADODB.Streamを使うことでさまざまな文字コードのデータを読み込むことができます。 CSVファイルを"UnicodeBE"で作成(エディタの機能で選択)し、以下のコードを実行してみたところ、一応"連番,コード,フラグ,日付"と表示されました。 文字コードについては素人に毛が生えた程度の知識しかないので"UTF-16BE"と"UnicodeBE"が同じものなのかは分かっていません。勘違いしていたらごめんなさい。 ---- Set oSt = WScript.CreateObject("ADODB.Stream") oSt.Open oSt.Type = 2 'バイナリ oSt.Charset = "UTF-16BE" oSt.LoadFromFile("be.csv") oSt.LineSeparator = -1 'CRLF oSt.Position = 0 sLine = oSt.ReadText(-2) WScript.Echo sLine ---- あと、ソート機能は不要ではないのでしょうか。 読み込んだ行のキーが0001だったら0001のファイルに出力し、0002だったら0002のファイルに出力し・・・とやっていくだけではないかと思うのですが。

superss28
質問者

お礼

ご回答ありがとうございます。 返信が遅れて申し訳ありません。 "UTF-16BE"と"UnicodeBE"は同じです。 ADODB.Streamを使ってのファイル入力は初めて知りました。 教えていただいたやり方でUnicodeBEファイルの入力もうまくいきました。 私が参考にしていたサイトや参考書には載っていませんでしたね…。 回答者さんはADODB.Streamについて どこかのサイトや参考書をご存知でしょうか? よろしかったら教えて頂きたいです。

その他の回答 (1)

  • kztk
  • ベストアンサー率53% (59/110)
回答No.2

こんにちは。 ADODB.Streamに関しては、本家本元のこちらのサイトをどうぞ http://msdn.microsoft.com/ja-jp/library/cc364272.aspx

superss28
質問者

お礼

ご回答ありがとうございます。 CreateObjectって色々な型を指定できるんですね。 大変参考になりました。

関連するQ&A

  • VBSでソート&ファイル分割

    VBScriptでCSVファイルを最大5件のレコードになるように ファイル分割しようとしています。 ただし、同じコードが複数のファイルに分かれないようにしたいです。 入力するCSVファイル(test_in.csv)は以下のような形式です。 (実際のファイルに項目行はありません) 連番,コード,フラグ,日付 01,0001,A,20091001 02,0002,A,20091001 03,0003,A,20091002 04,0001,U,20091003 05,0003,D,20091003 06,0004,A,20091003 07,0005,A,20091003 08,0001,D,20091005 09,0006,A,20091003 10,0006,A,20091003 ※入力ファイルに同じコードのレコードが5件を超えることはありません) 上記の入力ファイルの場合は以下の3つのファイルに分割することになります。 【test_out_001.csv】 01,0001,A,20091001 04,0001,U,20091003 08,0001,D,20091005 02,0002,A,20091001 【test_out_002.csv】 03,0003,A,20091002 05,0003,D,20091003 06,0004,A,20091003 07,0005,A,20091003 【test_out_003.csv】 09,0006,A,20091003 10,0006,A,20091003 ※コード"0003"のレコードは2件あるので、test_out_001.csvには出力せず、  test_out_002.csvに出力します。  コード"0006"についても同様でtest_out_003.csvに出力します。 処理の手順としては 入力ファイルのデータをコードでソートし、 1ファイルに5件を超えないように追加していくのかと思いますが、 ソートと5件制限はどのように記述すればよいでしょうか?

  • VBScriptのCloseとNothing

    VBScriptのCloseとNothing vbsでバッチ処理をプログラムを作っています。 内容は、テキストファイルの読み込みと書き込みです。 OpenTextFile(読み取り専用)でテキストファイルの中身を読み取り、 文字列操作後、 OpenTextFile(追記モード)で 読み取ったテキストファイルとは別のテキストファイルに書き込みます。 CloseとNothingは いつ、どのように使えばよいのですか? 参考サイトでも良いので教えてください。 よろしくお願いします。

  • VBSを利用して、文字列から一部分だけを抜き出す

    VBSを利用して、文字列から一部分だけを抜き出す こんにちわ VBSを利用して、csv形式のファイルを読み込んで文字列の一部を抜き出す 処理を行いたいと思っております。 具体的には、csv形式のファイルをtxt形式に置き換えると "aaaa","bbbb","ccc","ddd","あああeee","OS=abcde" というような形で開きます。 ※a~eの文字数は固定ではありません。 このような場合、文字列に「あああ」が含まれていたら、 「ccc」と「OS=*****」をcsvまたはtxtに出力する という処理を行おうとしております。 どのようにプログラムを組めば良いでしょうか。 お手数ですが、ご教授願えれば、助かります。よろしくお願い致します。

  • c/c++でのファイル読み込みについて

    C/C++で、現在勉強をしていますが、csvファイル形式で 作成したファイル(仮に30件ほど)を読み込んだ後、特定のファイル 1件分のみを指定して削除をしたいコードを作成しようと思っています。 どのようなコードを記述してよいか教えてください。

  • CSVファイルの読み書きについて

    みなさん、こんにちわ。 AというファイルからVBAを使ってデーターをCSV形式で書きだして、Bというファイルでその書き出したCSV形式のファイルを読み込んで、とある表を作成しています。 Bというファイルでの処理を外部に委託した時に、Aから書き出したCSV形式のファイルには、すべてのデーターが表示されていますので出来るなら見れないようにしたいと考えています。 Bファイルでの処理はあくまでも書き出したCSV形式のファイルを読み込むだけで、そのCSVファイルを見れないようにすることは出来ないのでしょうか? 暗号化・パスワード化はたまた別の方法どちらでもいいのですが、CSVファイルの中身がわからないようにし読み込みは今まで通りできればありがたいです。 勉強不足で誠に申し訳ないですが、どういった方法があるのか、どうすればいいのか教えて頂ければ有難いです。 よろしくお願いします。

  • テキストファイルウィザードを使用したCSVファイル読み込みの挙動について【Excel2003】

    テキストファイルウィザードを使用したCSVファイル読み込みの挙動について【Excel2003】 <CSVファイル例> "aaaa","bbb<改行コード 0d0A>bb","ccc" 上記のようなCSVファイルを、 ダブルクリックにてExcel起動すれば正常に表示されますが、 テキストファイルウィザード(データ→外部データ取り込み→データの取り込み) を使用して、読み込みを行うと改行されて表示されてしまいます。 これは、Excelの仕様なのでしょうか? ご存知の方いらっしゃいましたら教えていただけますでしょうか? 現在の本質的な問題は、 ------------------------------------------------------------------- Excel2003にて、文字コードがUTF-8のCSVファイルを下記方法にて読み込む ・テキストファイルウィザードを使用 ・文字コードをUTF-8 ・カンマ区切り設定 で読み込みを行うと文字化けしないで表示されるのですが ダブルコーテーション中のデータ内に改行コード0d0aが含まれると 改行されてしまいます。 ------------------------------------------------------------------- と言う現象の調査をしております。

    • 締切済み
    • PHP
  • VBSでCSVのキー項目の取得

    VBSでCSVファイル(UnicodeBE BOMなし)内のデータを キー項目(コード)ごとに分け、 それぞれ別のCSVファイルに出力しようとしています。 (ファイル名にコードを付与することで別々にします。) しかし、キー項目の取得に失敗しているようで 分岐処理が正しく行われていません。 CSVファイル(test_in.csv)は以下のような形式です。 (実際のファイルに項目行はありません) 連番,コード,フラグ,日付 1,0001,A,20091001 2,0002,A,20091001 3,0002,U,20091002 4,0001,D,20091003 以前、こちらで質問し、ご回答頂いた内容を基に 処理を実装しました。 Option Explicit Dim iSt Dim tPath Dim oFso Dim stdOut Dim aLine Dim field Dim wk Set iSt = WScript.CreateObject("ADODB.Stream") iSt.Open iSt.Type = 2 'バイナリ iSt.Charset = "UTF-16BE" iSt.LoadFromFile("test_in.csv") iSt.LineSeparator = -1 'CRLF iSt.Position = 0 tPath = "E:\\test_out.csv" Set oFso = CreateObject("Scripting.FileSystemObject") Set stdOut = CreateTextFileBE(oFso,tPath) Do While Not iSt.EOS aLine = iSt.ReadText(-1) field = split(aLine,",") aLine = join(field,",") if field(1) = "0002" then WriteLine stdOut,aLine end if Loop iSt.Close oFso.Close Set iSt = Nothing Set oFso = Nothing WScript.Quit Function CreateTextFileBE(fso,Path) fso.CreateTextFile(Path).Write Chr(&HFE) & Chr(&HFF) Set CreateTextFileBE=fso.OpenTextFile(Path,8,,True) End Function Sub WriteLine(stdOut,Line) stdOut.Write Line & vbCrLf End Sub 0002のレコードが入ったCSVファイルを出力しようとしましたが、 レコードなしのCSVファイルが作成されてしまいます。 コードごとにファイルを分ける処理についてもよくわからず、 取りあえずコードを限定し1ファイルだけの出力にしています。

  • 途中にEOFがあるファイルの読込

    VB6でファイルを全行読み込んで任意の処理を行いたいのですが、そのファイルには 途中に文字コード 1a (つまりEOF)が入っている場合があります。 普通に Line Input で処理すると、その部分でファイル終了と判断し 読込を終えてしまいますが、その後のデータも読み込みたいのです。 どのようにすれば良いのでしょうか?

  • Perlでのファイルの読み込み

    以下内容のファイルabc.csv を読み込み、1列目の文字列を指定したとき、2列目の文字列の内容を取得したいと思います。MEを指定したらMELONを取得したい。 その場合のコードを教えて下さい。 AP,APPLE OR,ORANGE ME,MELON PE,PEACH GR,GRAPE 以上、よろしくお願いします。

    • ベストアンサー
    • Perl
  • エクセルVBAで65536レコードを超えるCSVファイルの読み込み

    エクセル2000です。 現在CSV形式のファイルをもらい、エクセルVBAで1行づつエクセルに取り込み、加工しています。(CODEは、かなり省略していますが下記の通り) データは将来的には何万件におよぶことも考えられます。 ためしに65536を超えるデータを読み込ませたところ65536を超えたところでやはりエラーになりました。Workbooks.Openでエクセル形式で開いているので65536を超える部分は無視されるからだと思います。 このような場合には、どうやってCSVファイルからデータを読み込めばよいのでしょうか?(なお、エクセルは当分2007にはなりそうもありません。アクセスはまったく使えません。) Sub TEST01() Set cf = Workbooks.Open(Filename:=ThisWorkbook.Path & "\test.csv") Set zerro = cf.Sheets(1).Range("A1:AX1") ThisWorkbook.Sheets("Sheet1").Activate Do Until zerro.Cells(1).Value = "" ThisWorkbook.Sheets("Sheet1").Range("A1:AX1").Value = zerro.Value '処理マクロ省略 Set zerro = zerro.Offset(1) Loop End Sub