• ベストアンサー

Csvから1行ずつ変数に格納するには;

いつもお世話になっています。 次のようなcsvファイルがあります。 会員番号,パスワード,データ1,データ2,データ3 1234567,1111,1970/1/1,1990/4/1,A 1111111,1,1960/1/1,1985/4/1,AB ・ ・ ・ このcsvファイルをExcelのVBAで次のようなコードで読みとろうとしています。 Set fs = CreateObject("Scripting.FileSystemObject") Set f = fs.GetFile("csvファイル名") Set ts = f.OpenAsTextStream(1, -2) ssk = ts.readline readlineは1行だけ読み込むと覚えているのですが、なぜか変数sskにはすべての行が連結された状態で格納されてしまいます。 2回目以降のreadlineでは「ファイルにこれ以上データがありません。」と出ます。何か根本的に間違っているのでしょうか;; このようなcsvファイルを、正しく1行ずつ変数に格納する方法にはどのようなものがありますでしょうか。 よろしくお願いします。

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

  • ベストアンサー
  • t-aka
  • ベストアンサー率36% (114/314)
回答No.1

わざわざFSOを使うようなことでもない気がします。 open~closeステートメントでファイルを開いて line inputで読み込めば良いのではないでしょうか。 例文は確かヘルプファイルにあります。 FSOの必要性があったならば、失礼しました。

hitoshipon
質問者

お礼

返事とお礼が遅くなりまして申し訳ありません。 FSOを使ったのは、それしか知らなかったからです(!) 教えていただいた方法であっさりやりたいことができました。 本当にありがとうございます。

その他の回答 (2)

noname#140971
noname#140971
回答No.3

1234567,1111,1970/1/1,1990/4/1,A 1111111,1,1960/1/1,1985/4/1,AB 次は、これを1行づつ呼び込んで表示するサンプルコードです。 Private Sub コマンド0_Click()   Dim strData As String      Do     strData = FileRead("C:\Temp\Test.csv")     Debug.Print strData   Loop Until Len(strData) = 0 End Sub [イミディエイト] 1234567,1111,1970/1/1,1990/4/1,A 1111111,1,1960/1/1,1985/4/1,AB このように1行づつ変数に取り込んでイミディエイトウィンドウに出力しています。 そういうことで FileRead() の類を作成し利用するとコードは簡略化できます。 Public Function FileRead(ByVal FileName As String, Optional isStop As Boolean = False) As String On Error GoTo Err_FileRead   Static isOpen As Boolean   Static fso As Object   Static fil  As File   Static txs  As TextStream      If Not isOpen Then     isOpen = True     Set fso = CreateObject("Scripting.FIleSystemObject")     Set fil = fso.GetFile(FileName)     Set txs = fil.OpenAsTextStream(ForReading, TristateUseDefault)   End If   FileRead = txs.ReadLine Exit_FileRead:   If Len(FileRead) = 0 Or isStop Then     isOpen = False     Set txs = Nothing     Set fil = Nothing     Set fso = Nothing   End If   Exit Function Err_FileRead:   Resume Exit_FileRead End Function

hitoshipon
質問者

お礼

ご回答ありがとうございます。 まだまだVBA未熟者でして関数定義は使ったことありませんでした。 今回は#1さんの方法で解決しましたが、便利そうなので覚えておきます。 丁寧にありがとうございました。

回答No.2

元ファイルの1行がCRLFでなくCRで終わってるんじゃないでしょうか? ssk = ts.readline の後に Dim d() As String d = Split(ssk, vbCrLf) MsgBox "crlf=" & UBound(d) d = Split(ssk, vbCr) MsgBox "cr=" & UBound(d) d = Split(ssk, vbLf) MsgBox "lf=" & UBound(d) ts.Close '一応 を入れてみてください。 CRLFの個数,CRの個数(CRLFでもカウントされる),LFの個数(CRLFでもカウントされる)を表示します。 マイナス1個だけど。 たいした量でなければ、 ssk = ts.readall で全部読んで、splitで配列に入れて処理する方が楽ですよ。 p.s. FileSystemObjectを使う時は、 Microsoft Scripting Runtime を参照設定して、 dim fs as FileSystemObject と宣言して使う方が楽ですよ。

hitoshipon
質問者

お礼

回答ありがとうございます。 ご指示いただいたコードを追加してみましたが、全て-1が返されてしまいました。すでにsskの中で結合されて全ての改行がなくなっているためでしょうか? readallも考えたのですが、結構たくさんデータが増えそうなので躊躇していました。 FSOについても意味をあまり理解しないまま使っているので、教えていただいた方法も今後参考にさせていただきます。 ありがとうございました。

関連するQ&A

  • テキストファイルに一行文字を追加したい

    バッチ処理でテキストファイルの最後に文字列を追加する作業をやりたいのです。 普通の文字列ですと、1)のようにして上手くいきます。 ところが「"」の入った文字列を一行加えようと2)のようにすると、エラーになってしまいます。どうしたら前に進めるでしょうか? --------- 1)上手くいくケース ----------- Set fso = CreateObject("Scripting.FileSystemObject") Set tmpFile = fso.GetFile("C:\test\hoge.txt") Set f = tmpFile.OpenAsTextStream(8, -2) f.Write("一行追加しました") f.close Set f = Nothing Set tmpFile = Nothing Set fso = Nothing --------- 2)上手くいかないケース ----------- Set fso = CreateObject("Scripting.FileSystemObject") Set tmpFile = fso.GetFile("C:\test\hoge.txt") Set f = tmpFile.OpenAsTextStream(8, -2) f.Write("一行"追加"しました") f.close Set f = Nothing Set tmpFile = Nothing Set fso = Nothing

  • VBAで巨大なファイルの途中からの読み込み

    こんにちは。 EXCELのVBAにて巨大なファイルのデータを途中から読み込む方法がございましたらご教授いただきたいと思っています。 具体的には300万行ほどのCSVデータがありまして たとえば、50万行目のデータを読み込みたい場合下記のようにすることにより、データの取得は可能なのですが、50万行目までSKIPするのに数秒の時間がかかってしまいます。いきなり50万行目からのデータを取得するようなスマートな方法は存在するのでしょうか。 よろしくお願いいたします。 Const ForReading = 1, ForWriting = 2, ForAppending = 3 Dim fs, f Set fs = CreateObject("Scripting.FileSystemObject") Set f = fs.OpenTextFile("C:\tmp.csv", ForReading, 0) For w = 0 To 500000 f.skipline Next Debug.Print f.readline f.Close

  • CSVファイルのダウンロードができたりできなかったり・・

    ASPで、サーバー側で動的に作成したCSVファイルをクライアント側にダウンロードさせたいと思っていますが、 ダウンロードできるときとできないときがあり困っています。 「ファイルのダウンロード」ダイアログが表示され、うまくダウンロードできるときと、 「Internet Explorer では、[サイト名]-[aspファイル名]をダウンロードできません。このインターネットのサイトを開くことができませんでした。要求されたサイトがしようできないか、見つけることができません。後でやり直してください。」のメッセージが表示され、ダウンロードできない場合があります。 どちらもサーバー上にダウンロードすべきCSVファイルは作成されているので、ダウンロード部分に問題があると思うのですが、原因がわかりません。 ひとつ気づいたのが、csvファイルの容量が4.0MBを超えるとダウンロードできないような気がするのですが、関係ありますでしょうか? よろしくお願い致します。 --------出力のためのスクリプト----------------- Response.ContentType = "application/octet-stream" Response.AddHeader "Content-Disposition", "attachment; filename = " & CSVファイル名 Set fs = Server.CreateObject("Scripting.FileSystemObject") CSV_DATA = Server.MapPath(CSVファイル名) If fs.FileExists(CSV_DATA) Then Set ts = fs.OpenTextFile(CSV_DATA, 1) Do Until ts.AtEndOfStream Response.Write ts.ReadLine() & vbCrLf Loop ts.Close End If Response.End -----------------------------------------------

  • VBAで2変数の差分を取る方法  その2

    前回はありがとうございました。 まだ最終までは行ってないのですが、Wendyさんfumufumuさんに教えていただいたマクロともうまく動きます。 fumufumuさんの変数bufなんですが、この中身をシートに一行ずつ入れるにはどうするのでしょう。 Msgboxでは行ごとに綺麗に表示されす。 OpenAsTextStreamで開きReadAllで読み込んだbufの中身は配列になっているのでしょうか。 Splitで色々やってみたんですが、旨くいかいなです。 ---------------------------------------------------- Set fso = CreateObject("Scripting.FileSystemObject") With fso.GetFile(TXT).OpenAsTextStream .Skip size buf = .ReadAll .Close End With Set fso = Nothing MsgBox buf ------------------------------------------------------ fumufumuさんのDim fso As New FileSystemObjectでは動かなかったので Set fsoにするなど一部変えてあります。

  • CSVファイルの読み込み

    ASPの勉強をしています。 CSVファイルを読み込んでDBに登録していきたいのですが、 111,222,"aaa[改行]bbb","1,000",444,555 のようなデータがあったとすると、 「1,000」の桁区切りのカンマのせいで、 「1」 と 「000」に別れてしまいます。 これを防ぐプログラムを作りたいのですが、 わかる方よろしくお願いします。 現在はReadLineで1行ずつ読み込んでいます。 set ObjFS = CreateObject("Scripting.FileSystemObject") set Stream = ObjFS.OpenTextFile(Server.MapPath(FILENAME,1,false,0) ReadBuf = Stream.ReadLine

  • CSVファイル

    CSVファイルを1行ずつ比較して読み込み、一致した行を別ファイルに記述していこうと思っています。 現在、csvファイルを読み込む所まで出来ています。 比較して別ファイルに記述する方法を教えて下さい。 もしくはアドバイスください。 【ファイルの中身】 "09/09/2005 0:00:00,aaa,bbb,ccc" 【比較条件】 当日の日付を取得し、年月日だけで比較する Dim objFSO ' FileSystemObject Dim objFile ' ファイル読み込み用 Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") Set objFile = objFSO.OpenTextFile("c:\test.csv") Do while objFile.ReadLine <> ""         'IF文を記述(条件:日付)        '別ファイルに記述する Loop objFile.close Set objFileSystem = Nothing Set objFile = Nothing

  • VBAでtxtを読み込みxlsで保存したい

    C:\Documents and Settings\All Users\デスクトップ\sample.txt は次のようなデータになっています。 A B C 1,234 567,890 23,333 1,234 567,890 23,333 このデータをVBAを使ってExcelに読み込み、C:\Documents and Settings\All Users\デスクトップ\sample.xls として保存にしたいのですが、どのようなコードを書けばよいものでしょうか? sub test() Dim fso, f, ts Dim sline As String Set fso = CreateObject("scripting.filesystemobject") Set f = fso.getfile("C:\Documents and Settings\All Users\デスクトップ\sample.txt") Set ts = f.openastextstream(1) Do While ts.atendofstream <> True sline = sline & ts.readline & vbCrLf Loop ts.Close ' MsgBox sline End Sub ここまでいったのですが、slineをexcelにだすことができません。 教えていただけると助かります・。

  • php配列格納

    $lines = file ('db.csv'); 上記でファイルの中身を配列に入れますがその逆で データを配列にして格納したいのですがどうすればいいのでしょうか? ファイルの不要な行を除いて再度変数に配列で格納しファイルを作成 したいのです。

    • ベストアンサー
    • PHP
  • VB6.0にて、CSVファイルを読み込もうとしているのですが、1行ずつ

    VB6.0にて、CSVファイルを読み込もうとしているのですが、1行ずつ読み込めません。 以下のコードで、Lineのメッセージボックスが表示されないのです。 どなたか教えていただけないでしょうか。よろしくお願いします。 'CSVファイル読み込み Sub Stream() Dim Line, Temp As Variant Dim objFSO As Object Dim objStream As Object Const ForReading = 1, ForWriting = 2, ForAppending = 3 Set objFSO = CreateObject("Scripting.FileSystemObject") Set objStream = objFSO.OpenTextFile(strDFpath & strDFname(1), ForReading, False) Temp = objStream.ReadAll MsgBox Temp '最後の行までループ Do Until objStream.AtEndOfLine - 1 <> True '1行読む Line = objStream.ReadLine MsgBox Line Loop objStream.Close Set objStream = Nothing Set objFSO = Nothing End Sub

  • VBA csvを100万行ずつ各シートに読み込み

     今晩は、質問させていただきます。どうぞよろしくお願いいたします。 環境:Win7 64bit SP1、 エクセル2010 でございます。  「1000万行×3列」のCSVファイルデータを、100万行ずつ シート1~10に振り分けたく悩んでおります。 ・エクセルは100万行しかありませんので、「一旦開いてから各シートに分割」という方法が使えませんし、 ・またReadLineいたしますと(1行ずつの方法しか存じませんので)時間がかかりそうですし、 何よりcsvファイルのカンマ記号も含め1行全てが、エクセルのひとつのセルに入ってしまうのでは、などと考えております。  何か良さそうな方法を思いつかれる方はおられませんでしょうか。 もしお詳しい方がいらっしゃいましたら,どうぞよろしくお願いいたします。

専門家に質問してみよう