- ベストアンサー
INPUT関数でのCSV読込がおかしい件
VisualBasic6.0で開発しております。 string型にて宣言した配列にシーケンシャルモードで 開いたCSVファイルを、 INPUT関数にて読み込んでいるのですが、" あああ" といったデータが、 配列に入ると"あああ "となってしまいます。つまり空白文字列が頭からお尻に移動してしまいます。 どなたか原因がわかる方、また回避方法がわかるかた は教えて頂ければ幸いです。なお、LINEINPUTではそのような現象はおこりません。しかしLINEINPUTは速度の観点から使いたくありません。 <参考ソース> Type hairetu a As String b As String ・ ・ End Type Global 配列() As hairetu dim intfile as integer dim lngcnt as integer intFile = FreeFile Open "パス" For Input As #intFile lngCnt = 0 Do While Not EOF(intFile) redim preserve 配列(lngCnt) Input #intFile, 配列(lngCnt).a,配列(lngCnt).b,・・・ lngCnt=lngCnt+1 LOOP
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
MSDNライブラリの「Input # ステートメント」を読んでみましたか? >ファイルからデータを読み込む場合、通常、文字列データは文字列型 (String)、数値データは数値データ型として格納されます。これ以外のデータを読み込んだ場合、次に示すようにデータによって変数に割り当てられる型が異なります。 >カンマのみ、または空白行 Empty 値 (VarType 0) このように記述されています。この辺の問題なのだと思われます。 で、対応方法です。 現在、CSV内データは只単にカンマのみで区切られていると思います。 AAA, 222, CCC,DDD,EEE ↓ "AAA"," 222"," CCC","DDD","EEE" 上段だと文字・数字を自動判別して質問のような問題になるので、下段の様に(")で囲って文字列にしてしまえば解決できると思います。 一案なので、参考になれば幸いです。
その他の回答 (4)
- momoturbo
- ベストアンサー率55% (49/88)
自分の場合も同じ現象が出ました。 ただし、空白文字は後ろには行かず 消えてしまいました。 Line Inputを使用するしかないのでしょうか? Split関数を使用すると簡単にカンマ区切りで 配列に落ちますけど、速度はどうなんでしょう?(^ ^; あくまで推測です。 Inputを使用すると空白文字のカット(Trim関数)が 入ってしまうのではないでしょうか?
お礼
回答ありがとうございます。 うーん環境によって現象が違うのでしょうか!? でも問題は起こるんですねやはり。 split関数は聞いたことはありましたが、使ってみようと考えた事はありませんでした。明日使用を検討してみようと思います。
- kouta52
- ベストアンサー率27% (32/116)
ちなみに構造体は、文字を固定にはしないのですか? Type hairetu a As String * 5 b As String * 10 などです。 定義すれば、LSetを使えばできるのかなー? と思いました。
お礼
回答ありがとうございます 配列は現在、固定にもしています。この問題により 固定はやめていました。 Lsetなんて関数があったんですね。知りませんでした。明日試してみます。 ただ、現在、問題になっているのは" あああ "→"あああ "となってしまうことなんです。 右よせ、左よせであれば配列に入れた後に文字列操作をすれば問題ないのですが、 真ん中だと前もしくは後ろに空白が何文字あるのかわからないんです。
- momoturbo
- ベストアンサー率55% (49/88)
CSVファイルの見直しをしてみてはいかがでしょう? カンマ・タブなどを見直して見てください preseveをとってしまうと配列が初期化されてしまったと 思うのですが、その辺のプログラムの修正は大丈夫なんでしょうか?
補足
回答ありがとうございます 大丈夫です。はじめにレコード数をカウントしてredim(レコード数)等として宣言しています。タブは入っていないようです。カンマも区切り以外のデータには使用していません。
- noname20030910
- ベストアンサー率28% (2/7)
> LINEINPUTは速度の観点から使いたくありません。 速度を問題にするなら、 > redim preserve 配列(lngCnt) 1回毎の配列の拡張のほうが罪ははるかに重いと言えます。 (ファイルの行数にもよりますが) 性能を悪化させるための故意の嫌がらせと受け取られても仕方がないでしょう。
補足
失礼致しました。 redim preserve 配列(lngCnt)はマイクロソフトより 指摘あり、redimを使用して既に速度改善済みになります。
お礼
回答ありがとうございます 上記のMSDNは読みましたが、あまり考えていませんでした。勝手に型を認識してしまうんですね。。 CSVデータに手を入れるのはやや面倒でしたが、 ダブルコーテーションをつける事により解決 できました。 まことにありがとうございました