tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルDO・・・LoopでCSVファイルを読み込む時にEOFを飛び越える?
記事No8017
投稿日: 2008/08/26(Tue) 18:14
投稿者JJ
はじめまして、最近VB.NETを勉強し始めまして、右も左もわからない状態で
このサイトにたどり着きました。
いろいろ調べたのですが、回避方法が見つからず困っております。
【以下状況です】
Do Until 〜〜
Loop
を使いCSVファイルを読み込もうとしています。
以下ソースです。

Dim csvname As String
Dim fileNo As Integer = FreeFile()
Dim n As Integer
csvname = "c:\test\test.csv"
FileOpen(fileNo, csvname, OpenMode.Input)

do until eof(fileNo)
〜読み込む内容
loop
--------------
(当HPの「CSVファイルを読み込み構造体の配列に保存する」を参考に作成しています)
テストデータは5レコードあるのですが
6レコード目までLoopしエラーとなります。
いろいろ調べたのですが、回避方法がいまいちわかりません。
どなたか回避方法をご教授願えませんでしょうか。
よろしくお願いいたします。

[ツリー表示へ]
タイトルRe: DO・・・LoopでCSVファイルを読み込む時にEOFを飛び越える?
記事No8018
投稿日: 2008/08/26(Tue) 18:59
投稿者るしぇ
エラー発生行はどこで、
その時の変数内のデータはどうなっていて、
エラーメッセージは何が表示されているのですか?

[ツリー表示へ]
タイトルRe^2: DO・・・LoopでCSVファイルを読み込む時にEOFを飛び越える?
記事No8023
投稿日: 2008/08/27(Wed) 09:31
投稿者JJ
るしぇさん
ありがとうございます。
(返信が遅くなりまして、失礼いたしました)
また、情報の提示が不足しておりましたこと大変失礼いたしました。
> エラー発生行はどこで、
> その時の変数内のデータはどうなっていて、
> エラーメッセージは何が表示されているのですか?
まずテストレコードは5レコード(5行)です。
このファイルを先に記したコードで読み込もうとすると
「EndOfStreameExceptionはハンドルされませんでした。」
ファイルにこれ以上データはありません。というメッセージが表示されます。
またイミディエイトウィンドウには、正常に読み込まれたデータが連続的に表示され
最後の行に「system.IO.EndOfStreameExceptionの
初回例外がMicrosoft.VisualBasic.dllで発生しました」
というメッセージが表示されております。
エラーで停止した時の「n(レコードNo用の変数)」の値が5になっているので
メッセージの通りEOFを飛び越えているのかと思っております。
なお、今回の処理は
「読み込んだ後に各項目のフォーマットチェックを行い不正データに対して
(元ファイルのレコード番号を元に画面上で修正を行い新しいレコード番号を付加し
別名で保存する」という処理を行いたかった為に、この方式で読み込むのが良いかと考え
コーディングしました。
極めて初歩的な質問であり、大変申訳ありませんがよろしくお願いいたします。

[ツリー表示へ]
タイトルRe^3: DO・・・LoopでCSVファイルを読み込む時にEOFを飛び越える?
記事No8026
投稿日: 2008/08/27(Wed) 15:03
投稿者るしぇ
>エラーで停止した時の「n(レコードNo用の変数)」の値が5になっているので
>メッセージの通りEOFを飛び越えているのかと思っております
肝心の n を設定しているコードが書かれていません。
ただし、
>(当HPの「CSVファイルを読み込み構造体の配列に保存する」を参考に作成しています
とのことですので、
http://hanatyan.sakura.ne.jp/dotnet/fileio03.htm#no1
この通りコードを書いてるとして、データが5レコード(5行)
あった場合、n が5になるのは正常な処理です。
ループでEOFを飛び越えているのではありません。

予想を立てるのは大事ですが、必ず確認してください。
1行1行ステップ実行して確認してみてください。
原因は質問文に書かれていないコードにあると思います。

Input の数とデータの数が合っていないか、改行コード
みたいにメモ帳で見ると見えない行があるかあたりを
調べてみてください。

改行コードは改行コードを表示できるエディタなんかが
いいと思うけど、
        Dim csvname As String = "c:\test\test.csv"
        Dim strTextData As String
        Dim sr As New System.IO.StreamReader(csvname, System.Text.Encoding.Default)
        strTextData = sr.ReadToEnd
        strTextData = strTextData.Replace(System.Environment.NewLine, "[改行コード]" & System.Environment.NewLine)
        Debug.WriteLine(strTextData)
        sr.Close()
みたいなのでも確認できますよね。

[ツリー表示へ]
タイトルRe^4: DO・・・LoopでCSVファイルを読み込む時にEOFを飛び越える?
記事No8027
投稿日: 2008/08/27(Wed) 15:43
投稿者JJ
るしぇさん
早速のご回答ありがとうございます。
> 予想を立てるのは大事ですが、必ず確認してください。
> 1行1行ステップ実行して確認してみてください。
> 原因は質問文に書かれていないコードにあると思います。
その後も本事象は収まらなかったのですが
Try〜Chatchを組みこみ「EndOfStreamException」
をチェックすることで問題の発生を回避しました。
(問題の回避ができるようになってから、しばらくはDebugウィンドウに

> 原因は質問文に書かれていないコードにあると思います。
今回は時間的制約があり、この方法で回避しますが
ご指摘の通りより詳細にチェックしそもそも問題が発生しないように
することが大切ですね。

ありがとうございました。

[ツリー表示へ]
タイトルRe: DO・・・LoopでCSVファイルを読み込む時にEOFを飛び越える?
記事No8020
投稿日: 2008/08/26(Tue) 20:47
投稿者neptune
こんにちは

回避方法も良いですが、frameworkを使うんですから、
System.IO とかMy.Computer を使った方が良いですよ。
「ファイルおよびストリーム入出力」
http://msdn.microsoft.com/ja-jp/library/k3352a4t.aspx
「My.Computer.FileSystem オブジェクトのメンバ」
http://msdn.microsoft.com/ja-jp/library/ms172966(VS.80).aspx
サンプルも沢山あります。

[ツリー表示へ]
タイトルRe^2: DO・・・LoopでCSVファイルを読み込む時にEOFを飛び越える?
記事No8024
投稿日: 2008/08/27(Wed) 09:36
投稿者JJ
neptuneさん
こんにちは。
返信が遅くなり申訳ありません。
るしぇさんへの返信にも書きましたが
「読み込んだ後に各項目のフォーマットチェックを行い不正データに対して
(元ファイルのレコード番号を元に画面上で修正を行い新しいレコード番号を付加し
別名で保存する」という処理を行いたかった為に、この方式で読み込むのが良いかと考え
コーディングしておりました。
> 回避方法も良いですが、frameworkを使うんですから、
何分Freameworkを使って作成する事が初めてなものでして(汗)
最善策が何なのかいまいちピンと来ていないというところです。
サンプルの検索も不十分のようでした。
もう少し探してみますね。
ご指摘ありがとうございます。

>
こんにちは
>
> 回避方法も良いですが、frameworkを使うんですから、
> System.IO とかMy.Computer を使った方が良いですよ。
> サンプルも沢山あります。

[ツリー表示へ]
タイトルRe: DO・・・LoopでCSVファイルを読み込む時にEOFを飛び越える?
記事No8028
投稿日: 2008/08/27(Wed) 16:13
投稿者花ちゃん
CSV データを扱う場合は、区切りの ,(カンマ)の数とデータ中のカンマ等を意識して
プログラムを作成する必要があります。

今回に場合、1行内のカンマの数が正しく合っていないのが原因かと思われます。
何も記入していない列があったり、他の行の列数と違う行があったり、データ中に
カンマが含まれていないか、最終行等に空行が含まれていないか確認して見て下さい。

又、そのようなデータを読み込む場合、1行づつカンマの数(データの区切り位置)を
調べながら読み込むようなプログラムを作成しないと正しいデータを読み込めません。
(エラー処理で逃げたのではだめです。)

[ツリー表示へ]