C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: VB6のCSV取込プログラムについて


(過去ログ 91 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■54339 / inTopicNo.1)  VB6のCSV取込プログラムについて
  
□投稿者/ VB533151 (16回)-(2010/10/14(Thu) 11:14:18)

分類:[VB6 以前] 

お世話になります。

VB6のCSV取込プログラムで、取込ファイルを最終行まで読み込まして取り込みを行ないたいのですが
途中で改行コードが存在すると、最終行まで取り込めなくて困っています。
対象方法などあればご教授頂けると助かります。


Dim iCsvFilenm As Integer
Dim iCsvFilenmStd As Integer
Dim sBuf As String
Dim sRowData As String

Do While Not EOF(iCsvFilenm)
Line Input #iCsvFilenm, sBuf
Print #iCsvFilenmStd, sRowData
Loop

-----------------
test.csv(OK)
-----------------
aaa,bbb,ccc
ddd,eee,fff

-----------------
test2.csv(NG)
-----------------
aaa,bbb,ccc

ddd,eee,fff


引用返信 編集キー/
■54342 / inTopicNo.2)  Re[1]: VB6のCSV取込プログラムについて
□投稿者/ 魔界の仮面弁士 (1869回)-(2010/10/14(Thu) 11:48:51)
2010/10/14(Thu) 11:51:29 編集(投稿者)

No54339 (VB533151 さん) に返信
> VB6のCSV取込プログラムで、取込ファイルを最終行まで読み込まして取り込みを行ないたいのですが

まずは、CSV の定義を定めておいてください。

CSV の一般的な書式は、RFC4180 という文書にまとめられているのですが、
これは後付けされた仕様であり、標準的な書式というものが存在していません。

そのため、「CSV の作成側」と「CSV を読み込む側」とで、
そのフォーマットを合わせておく必要があります。


・文字コードは Shift_JIS なのか、それともそれ以外か。
・ヘッダー行は存在するのか、しないのか。
・改行コードは CRLF か、それともそれ以外か。
・行によって列数が異なる可能性があるか否か。
・データ中に「,」「改行」「"」などを含める事を許容しているか否か。
・「レコード末尾に改行」なのか、「レコード間に改行」なのか。
 (言い換えれば、バイナリの最後に改行が存在するか否か)
・フィールドを「"」で囲むのか囲まないのか。
 囲む場合は、データ中に「"」が来た場合の振る舞いはどうなっているか。



> aaa,bbb,ccc
>
> ddd,eee,fff
この CSV データは、一般的には
 1行目は3列=[aaa], [bbb], [ccc改行]
 2行目は3列=[ddd], [eee], [fff]
を意味しません。

通常は、
 1行目は3列=[aaa], [bbb], [ccc]
 空行は無視
 2行目は3列=[ddd], [eee], [fff] …(論理行:2行目、物理行:3行目)
もしくは、
 1行目は3列=[aaa], [bbb], [ccc]
 2行目は0列=
 3行目は3列=[ddd], [eee], [fff]
または、
 1行目は3列=[aaa], [bbb], [ccc]
 2行目は1列=[]
 3行目は3列=[ddd], [eee], [fff]
などと解釈される事になります。


今回は、どのように読み込みたいのでしょうか?
引用返信 編集キー/
■54345 / inTopicNo.3)  Re[1]: VB6のCSV取込プログラムについて
□投稿者/ shu (104回)-(2010/10/14(Thu) 12:20:44)
No54339 (VB533151 さん) に返信
>
> VB6のCSV取込プログラムで、取込ファイルを最終行まで読み込まして取り込みを行ないたいのですが
> 途中で改行コードが存在すると、最終行まで取り込めなくて困っています。
どういう現象が発生しているのですか?


> Line Input #iCsvFilenm, sBuf
> Print #iCsvFilenmStd, sRowData
この間の処理は何をしているのでしょう?そこに問題はありませんか?
引用返信 編集キー/
■54348 / inTopicNo.4)  Re[2]: VB6のCSV取込プログラムについて
□投稿者/ VB533151 (18回)-(2010/10/14(Thu) 12:49:55)
No54342 (魔界の仮面弁士 さん) に返信
> 2010/10/14(Thu) 11:51:29 編集(投稿者)
>
>・文字コードは Shift_JIS なのか、それともそれ以外か。
→ Shift_JISになります。

>・ヘッダー行は存在するのか、しないのか。
→ 存在します。タイトル行以降で取込みを実施します。

>・改行コードは CRLF か、それともそれ以外か。
→ CRLFになります。

>・行によって列数が異なる可能性があるか否か。
→ ありません。

>・データ中に「,」「改行」「"」などを含める事を許容しているか否か。
→ ありません。

>・「レコード末尾に改行」なのか、「レコード間に改行」なのか。
> (言い換えれば、バイナリの最後に改行が存在するか否か)
→ レコード末尾に改行になります。

>・フィールドを「"」で囲むのか囲まないのか。
> 囲む場合は、データ中に「"」が来た場合の振る舞いはどうなっているか。
→ 囲みません。





>今回は、どのように読み込みたいのでしょうか?
→ よくよく確認してみると、以下の事が判明しました。

Do While Not EOF(iCsvFilenm)
Line Input #iCsvFilenm, sBuf

'カンマでデータを分割
sArray = Split(sBuf, ",")

If Trim(sArray(0)) = CON_CSV_TITLENAME Then

→ 上記のif文で sArray が「インデックスが有効範囲にありません」となり、LOOP処理を終了していました。
上段のSplitで空白行に対して、行なっている為でしょうか?
空白行は無視する仕様にして、全ての行を取込めるようにしたいと考えております。
引用返信 編集キー/
■54350 / inTopicNo.5)  Re[3]: VB6のCSV取込プログラムについて
□投稿者/ 魔界の仮面弁士 (1871回)-(2010/10/14(Thu) 12:56:12)
No54348 (VB533151 さん) に返信
> >・データ中に「,」「改行」「"」などを含める事を許容しているか否か。
> → ありません。

これを許容していないのであれば、
> aaa,bbb,ccc
>
> ddd,eee,fff
というのは、そもそも異常データに相当しますので、
エラーが起きたとしても、ある意味ではそれは仕様のうちです。

もし、上記を
> aaa,bbb,ccc
> ddd,eee,fff
と同じデータとして処理したいのであれば、Split する前に
sBuf の中身が空であるかどうかを確認してやれば良いでしょう。

 If sBuf = "" Then
  MsgBox "異常データエラー"
  Exit Do
 Else
  sArray = Split(sBuf, ",")
   :
 End If

もしくは、Split してから LBound(sArray) や UBound(sArray) を
調べるという手もあります。
引用返信 編集キー/
■54351 / inTopicNo.6)  Re[3]: VB6のCSV取込プログラムについて
□投稿者/ shu (107回)-(2010/10/14(Thu) 13:04:33)
No54348 (VB533151 さん) に返信

> 'カンマでデータを分割
> sArray = Split(sBuf, ",")
>
> If Trim(sArray(0)) = CON_CSV_TITLENAME Then
>
> → 上記のif文で sArray が「インデックスが有効範囲にありません」となり、LOOP処理を終了していました。
> 上段のSplitで空白行に対して、行なっている為でしょうか?
厳密には空行だからエラーとなっています。sBufが空文字列なのでsArrayの要素数が0であるにも関わらず
インデックス0を参照したので有効範囲にありませんとなっています。

> 空白行は無視する仕様にして、全ての行を取込めるようにしたいと考えております。
データ読込んだ次にif でsBufが空文字列(空白だけの行も除くならTrimしてから判定)ならその行は
処理しないようにすればよいです。
引用返信 編集キー/
■54354 / inTopicNo.7)  Re[4]: VB6のCSV取込プログラムについて
□投稿者/ VB533151 (19回)-(2010/10/14(Thu) 14:22:01)
No54350 (魔界の仮面弁士 さん) に返信


Do While Not EOF(iCsvFilenm)
Line Input #iCsvFilenm, sBuf

If sBuf = "" Then
次の行へ(記述方法が不明)
End If

'カンマでデータを分割
sArray = Split(sBuf, ",")


上記条件で、次の行を読み込みたいのですが
どのように記述すれば宜しいでしょうか?


引用返信 編集キー/
■54355 / inTopicNo.8)  Re[5]: VB6のCSV取込プログラムについて
□投稿者/ shu (108回)-(2010/10/14(Thu) 14:28:26)
No54354 (VB533151 さん) に返信
魔界の仮面弁士の記述で
MsgBox "異常データエラー"
  Exit Do
の2行を削除すればOK(取込行処理はelseにすべて含める)

データとしてそれでいいのか?という事
引用返信 編集キー/
■54356 / inTopicNo.9)  Re[2]: VB6のCSV取込プログラムについて
□投稿者/ PATIO (26回)-(2010/10/14(Thu) 14:32:22)
ある意味、VB533151さんの思い込みと言うか、
起こりうる状況をきちんと想定で既定ない事が原因だと思いますよ。

すでに指摘されているように空行(改行のみの行)の存在がフォーマット仕様として
許されているのであれば、読み込んだ行が空行である可能性は当然考えておくべきです。
その場合にどのようにプログラムが振舞うべきなのかはプログラムを作成する時に
決めておくべき事なのできちんと仕様として決めた上で話を進めるべきでしょう。
最初から全ての状況を想定できればそれがベストですけれど、やはり後からわかる内容も
出てきますから、そういう場合でも出てきた都度にどう振舞うべきなのかをきちんと決定
してから進めるべきだと思います。
大切な事は決定された仕様が関係者の間できちんと共有されている事です。
この辺はきっちり押さえておけると後々のトラブルを未然に防ぐ事ができます。

実際の実装の話に関しては既に皆さんが説明されているのでそちらを参考にされてください。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -