• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Do文を使い方について)

Do文を使い方について

このQ&Aのポイント
  • ファイルからデータを読み込んで変数に保存する際に、エラーが発生しています。どのように修正すれば良いでしょうか?
  • ループ内でファイルから読み込んだデータを表示する方法を教えてください。
  • Do文を使って2つのファイルからデータを読み込み、変数に保存する方法を教えてください。

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

  • ベストアンサー
  • yy_y
  • ベストアンサー率39% (99/252)
回答No.3

#直接の回答ではありません. 'login.CSVファイルを開く FileNo = 1 FileOpen(FileNo, fileName, OpenMode.Input) 'logout.CSVファイルを開く FileNum = 2 FileOpen(FileNum, fileName2, OpenMode.Input) はFreeFile()を使って, 'login.CSVファイルを開く FileNo = FreeFile() FileOpen(FileNo, fileName, OpenMode.Input) 'logout.CSVファイルを開く FileNum = FreeFile() FileOpen(FileNum, fileName2, OpenMode.Input) としたほうが良いと思います.(ファイル番号の重複防止)

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

noname#14275
noname#14275
回答No.5

+内側のループはlogout.CSVのEOFしかチェックしていない +logout.CSVにはまだデータがあるが、login.CSVにはデータがなくなった +login.CSVにデータがなくなってもlogout.CSVにデータがあるときは内側のループは終了しないため、エラーが起きる エラーが起きる行は、login.CSVのデータを読むところですよね? また、login.CSVより先にlogout.CSVのデータがなくなったときは、内側のループに入らなくなるため、外側のループはいつまでたっても終了しません。 エラーが起きないようにするには、ループを1つにして、どちらのファイルもEOFでないときにループを実行する、という風にしたらどうでしょう。 対応するデータがないのですから、どちらかのファイルのデータがなくなればループを終了する、という考えです。 #今日はもう寝ます、、

全文を見る
すると、全ての回答が全文表示されます。
noname#14275
noname#14275
回答No.4

「ファイルにこれ以上データがありません」というエラーが出るということは、EOFに達したのにファイルからデータを読み込もうとしている、のだと思います。 2つのファイルのデータ数は同じなのでしょうか。

0417
質問者

補足

2つのファイル内のデータ数は同じときもあれば違う時もあります。前にも書きましたが、異なった2つのCSVファイル同士(レコード)を比較し、比較結果によっては、片方のレコードだけ更新するようにしたいのです・・・

全文を見る
すると、全ての回答が全文表示されます。
  • OsieteG00
  • ベストアンサー率35% (777/2173)
回答No.2

Input(FileNo, setD1) Input(FileNo, setD2) Input(FileNo, setD3) Input(FileNo, setD4) 上記のブロックが同じループ中に2個ありますので、上段でEOFになっても下段で読みに行ってエラーになっていると思います。 どちらか一つでよいのでは? また、login.CSVとlogout.CSVは同じ件数ですか? 違う件数だとエラーが出ます。 違う条件なら、どちらかがEOFまで、という条件に変更すれば良いと思います。 ループを一重にして、 Do Until EOF(1) or EOF(2) ~ loop で駄目でしょうか? また、件数はどちらも4の倍数件またはカンマ区切りで4の倍数個あるのでしょうか? レコードの読み込み方(設計含む)そのものを変更した方が良いかも。 例:setD1~setD4を一度に読み込むようにする、等。

0417
質問者

補足

どうのようにしたいか追加説明しますと、異なった2つのCSVファイル同士(レコード)を比較し、比較結果によっては、片方のレコードだけ更新するようにしたいのですが・・・

全文を見る
すると、全ての回答が全文表示されます。
  • denbee
  • ベストアンサー率28% (192/671)
回答No.1

最終的に何をしたいのかがよくわかりませんので原因だけ。 上記のコーディングはDOループが入れ子構造になっています。 DO UNTIL Aファイルの最終位置 ・・・(1)  DO UNTIL Bファイルの最終位置 ・・・(2)  Aファイルの項目の読み出し  Bファイルの項目の読み出し Loop ・・・(2)のループの折り返し Loop ・・・(1)のループの折り返し この場合、 1)Aファイルの1項目目を読み出す((1)の1回目のループ) 2)Bファイルの1~最後の項目まで読み出す((2)のループ) 3)Aファイルの2項目目を読み出す((1)の2回目のループ) 4)Bファイルの読み出し という手順で進みますが、2)で既にファイルの最終位置まで読み出しているのに、 4)で更にデータを読み出そうとしたためにエラーとなっているように思われます。

0417
質問者

補足

説明不足ですみません。ちなみに指摘された、2)で既にファイルの最終位置まで読み出しているのに、4)で更にデータを読み出そうとしたためにエラーとなっているようのを直すにはどうしたら良いでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • lineinput について

    下記のプログラムで処理を繰り返す時、どうして LinInput関数は正確に順序良く1行1行を読み取るのか分かりません。 下のプログラムでは永遠に1行目を読み取るか、読み取る行が ランダムになってしまうような気がするのですが、なぜでしょうか? 宜しくお願いします。 ---------------------------------------------------------------- filenum = FreeFile() FileOpen(filenum, openfile, OpenMode.Input) Do Until EOF(filenum) readline = LineInput(filenum) TextBox1.Text = TextBox1.Text & readline & vbCrLf Loof FileClose(filenum)

  • VB2008の自作アプリの配布について教えて下さい

    VB2008の自作アプリの配布について教えて下さい 自作アプリを作成し、デバッグだと正常に作動するのですが、 ビルドだと、エラーが出てしまいます。 多分エラー内容はtxtが見当たらないんだと思います (txtを複数個呼び出してます) プログラム中の、呼び出してるのはこれです FileOpen(1, My.Application.Info.DirectoryPath & "\メモ.txt", OpenMode.Input) FileOpen(2, My.Application.Info.DirectoryPath & "\メモ2.txt", OpenMode.Input) メ = My.Application.Info.DirectoryPath & "\メモル.txt" FileOpen(3, メ, OpenMode.Input) FileOpen(4, My.Application.Info.DirectoryPath & "\攻撃1.txt", OpenMode.Input) FileOpen(5, My.Application.Info.DirectoryPath & "\攻撃2.txt", OpenMode.Input) FileOpen(6, My.Application.Info.DirectoryPath & "\攻撃3.txt", OpenMode.Input) FileOpen(7, My.Application.Info.DirectoryPath & "\攻撃4.txt", OpenMode.Input) FileOpen(8, My.Application.Info.DirectoryPath & "\攻撃5.txt", OpenMode.Input) FileOpen(9, My.Application.Info.DirectoryPath & "\攻撃6.txt", OpenMode.Input) 因みに今txtファイルはdebugフォルダに入っています。 txtファイルを含めたビルドを発行するにはどうすればいいのでしょうか?

  • 文字コードについて

    特定のコードを指定して保存してみましたが、文字列を読み込めません。 どうしたら、読み込めるようになるかを教えてください。例えば、 FileOpen(FreeFile(), FileName, OpenMode.Output) Print(Filenum, Chr(150)) FileClose() というような具合で保存すると、文字列を読み込んでコードを表示しても0になります。 よろしくお願いします。

  • 文字列の出力で

    はじめまして、vb.netの初心者です。 テキストファイルの作成で下記のようにした場合 FileOpen(1, FileName, OpenMode.Output) Writeline(1,"AAAA")   FileClose(1) "AAAA"と文字列が出力されるところを の""を外して AAAA と出力指定のですが何か良い方法はないでしょうか? よろしくお願い致します。m(_ _)m

  • FileOpen 関数で既にファイルが開かれている場合

    よろしくお願いします。 VB.net で開発しているのですが、 FileOpen関数を使って、READONLYでファイルを開きたいのですが 既に開かれている場合、異常終了してしまいます。 他で開かれていても、読み込みだけをする方法はないでしょうか? ちなみに下記を試したのですが落ちてしまいました。 FileOpen(Number, 対象ファイル, OpenMode.Input) FileOpen(Number, 対象ファイル, OpenAccess.Read) FileOpen(Number, 対象ファイル, OpenMode.Input, OpenAccess.Read)

  • VB2005でのファイル操作について

        Dim filedata As String Dim fileNum As Integer Dim fileName As String Dim i As Integer fileName = "C:\Paradata.txt" fileNum = FreeFile() FileOpen(fileNum, fileName, OpenMode.Output) For i = 0 To 9 filedata = data(i, 0) & "," & data(i, 1)・・・・・ PrintLine(fileNum, filedata) Next FileClose あるボタンを押しますと上記のようにテキストファイルにデータを保存しようとしているのですが、1回目のボタンクリックではエラーが無いのですが2回目以降は"別のプロセスで使用されているため、プロセスはファイル 'C:\Paradata.txt' にアクセスできません。"のエラーが発生してしまいます。いろいろと調べているのですがまだわからないのでどこがおかしいか教えてください。よろしくお願い致します。

  • VB2005のファイル読込でDo While Not EOFを使用するには?

    いつもお世話になります。VB2005でテキストファイル(中身は1レコードのみ)をFileOpen関数の ランダムアクセスを使用し、FileGet関数で値を取得しました。しかし、取得後に続くDo While Not EOF~LOOP内の 処理が実行されません。同じファイルでVB6版で使用したら問題なく実行されたのですが。 どのように対応したらよろしいのでしょうか? よろしくお願い致します。 ソース Structure TypeUkeData '(Length = 100) <VBFixedArray(7), MarshalAs(UnmanagedType.ByValArray, SizeConst:=8)> Dim b_UkeDate() As Byte  '受付日 <VBFixedArray(7), MarshalAs(UnmanagedType.ByValArray, SizeConst:=8)> Dim b_UkeTime() As Byte   '受付時刻 <VBFixedArray(3), MarshalAs(UnmanagedType.ByValArray, SizeConst:=4)> Dim b_UkeCnt() As Byte '件数 <VBFixedArray(79), MarshalAs(UnmanagedType.ByValArray, SizeConst:=80)> Dim b_UkeNaiyo() As Byte '内容 Public Sub Initialize() ReDim b_UkeDate(7) ReDim b_UkeTime(7) ReDim b_UkeCnt(3) ReDim b_UkeNaiyo(79) End Sub End Structure Sub ReadFile Dim b_UkeData As TypeUkeData Dim i_FileNo As Short Dim i_RecNo As Short call b_UkeData.Initialize() i_FileNo = FreeFile() FileOpen(i_FileNo, "C:\UkeData.tmp", OpenMode.Random, , , 100) ' 最初のレコードを読み込む i_RecNo = 1 FileGet(i_FileNo, b_UkeData, i_RecNo) ←b_UkeDataに確かに値は入っている Do While Not EOF(i_FileNo)  ←ループ内の処理に一度も入らず次のFileCloseにいってしまう CALL SubSpilit(b_UkeData) ' 次のレコードを読み込む i_RecNo = i_RecNo + 1 FileGet(i_FileNo, b_UkeData, i_RecNo) Loop FileClose(i_FileNo) End Sub

  • OpenOfficeBasicで漢字が表示できない

    OpenOfficeBasicで、CSVファイルを読み、CELLにセットしていくと漢字が文字化けしてしまいます。 何かの設定がおかしいと思いますが、わかりません。 よろしくご教授ください。 OSはCentos5です。 OpenOffice.org3 Linux用を使っています。 マクロの内容は以下の通りです。 sub csvinput dim document as object document = ThisComponent.CurrentController.Frame dim FileNo As Integer dim data As String dim File As String Filename = "/var/webapps/doc/test/nippou.csv" FileNo = Freefile Open Filename For Input As FileNo Do While not eof(FileNo) dim args2(0) as new com.sun.star.beans.PropertyValue args2(0).Name = "StringName" Input #FileNo, data args2(0).Value = data Loop Close #FileNo endsub

  • 日本語混じりのファイルをランダムアクセスで読みこむ場合

    ファイルを1024バイトずつ読みこみ、その内容をソケットでホストへ送るというアプリがあります。 ファイルを「1024バイト読んで→送信」を繰り返すのですが、ファイルを読みこむところ(Get)で日本語が混じったときにエラーを生じます。 「レコード長が一致しません」というエラーメッセージです。 日本語がはいる桁数だけバイト数は減るためだと思いますが、ランダムアクセスで読みこむと場合の記述の仕方で、何とかならないものかと思案しています。 どなたかご教授ください。よろしくお願いします。 <プログラム記述例>   Dim filenum As Integer   Dim filename As String   Dim buffer As String * 1024   filename = "e:\tmp\file.txt"   filenum = FreeFile   Open filename For Random Access Read As #filenum Len = 1024   Do While Not EOF(filenum)     Get #filenum, , buffer   Loop   Close #filenum

  • ダブルクォーテーション付きの文字列を含むファイルを読み込む方法?

    Visual Basic 2008 Express Editionを使用しています。 IE上の範囲選択のHTMLテキストをテキストファイルに保存しています。 保存日時(Date型):time "文字列":moji のように保存しています。 FileOpen(n, "Data.dat", OpenMode.Append)  WriteLine(n, time, moji) ~保存されたファイルの例~ #2008-08-31 10:21:05# , "この記事に関するコメントを投稿するには、下のボタンをクリックしてください。投稿フォームが表示されます。通常のご質問、ご意見等は<A href=""/vb/bbs/index.html"">掲示板</A>へご投稿ください。 " このファイルを以下のように読み込もうとしています。 FileOpen(n, "Data.dat", OpenMode.Input) Do While Not EOF(n) Input(n, time) Input(n, moji) TextBox1.Text += vbCrLf & time & vbCrLf & moji & vbCrLf Loop  ところが、HTMLの文字配列の中には、<a href="" http://・・・・ "">のようにダブルクォーテーションが含まれています。ダブルクォーテーションが2つなら、文字列として扱ってもらえると思っていましたが、文字列の終了位置として認識してしまうようです(エラーの内容から判断しました。) ダブルクォーテーションを含む文字列の場合どのように処理したらよいでしょうか?