アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (5件)

MSDNライブラリの「Input # ステートメント」を読んでみましたか?



>ファイルからデータを読み込む場合、通常、文字列データは文字列型 (String)、数値データは数値データ型として格納されます。これ以外のデータを読み込んだ場合、次に示すようにデータによって変数に割り当てられる型が異なります。
>カンマのみ、または空白行 Empty 値 (VarType 0)
このように記述されています。この辺の問題なのだと思われます。

で、対応方法です。

現在、CSV内データは只単にカンマのみで区切られていると思います。

AAA, 222, CCC,DDD,EEE

"AAA"," 222"," CCC","DDD","EEE"

上段だと文字・数字を自動判別して質問のような問題になるので、下段の様に(")で囲って文字列にしてしまえば解決できると思います。

一案なので、参考になれば幸いです。
    • good
    • 0
この回答へのお礼

回答ありがとうございます

上記のMSDNは読みましたが、あまり考えていませんでした。勝手に型を認識してしまうんですね。。

CSVデータに手を入れるのはやや面倒でしたが、
ダブルコーテーションをつける事により解決
できました。

まことにありがとうございました

お礼日時:2003/10/01 12:33

自分の場合も同じ現象が出ました。


ただし、空白文字は後ろには行かず
消えてしまいました。
Line Inputを使用するしかないのでしょうか?
Split関数を使用すると簡単にカンマ区切りで
配列に落ちますけど、速度はどうなんでしょう?(^ ^;


あくまで推測です。
Inputを使用すると空白文字のカット(Trim関数)が
入ってしまうのではないでしょうか?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

うーん環境によって現象が違うのでしょうか!?
でも問題は起こるんですねやはり。

split関数は聞いたことはありましたが、使ってみようと考えた事はありませんでした。明日使用を検討してみようと思います。

お礼日時:2003/09/30 00:40

ちなみに構造体は、文字を固定にはしないのですか?


Type hairetu
   a As String * 5
   b As String * 10

などです。
定義すれば、LSetを使えばできるのかなー?
と思いました。
    • good
    • 0
この回答へのお礼

回答ありがとうございます

配列は現在、固定にもしています。この問題により
固定はやめていました。

Lsetなんて関数があったんですね。知りませんでした。明日試してみます。

ただ、現在、問題になっているのは" あああ "→"あああ  "となってしまうことなんです。
右よせ、左よせであれば配列に入れた後に文字列操作をすれば問題ないのですが、
真ん中だと前もしくは後ろに空白が何文字あるのかわからないんです。

お礼日時:2003/09/30 00:38

CSVファイルの見直しをしてみてはいかがでしょう?


カンマ・タブなどを見直して見てください

preseveをとってしまうと配列が初期化されてしまったと
思うのですが、その辺のプログラムの修正は大丈夫なんでしょうか?

この回答への補足

回答ありがとうございます

大丈夫です。はじめにレコード数をカウントしてredim(レコード数)等として宣言しています。タブは入っていないようです。カンマも区切り以外のデータには使用していません。

補足日時:2003/09/29 13:27
    • good
    • 0

> LINEINPUTは速度の観点から使いたくありません。



速度を問題にするなら、

> redim preserve 配列(lngCnt)

1回毎の配列の拡張のほうが罪ははるかに重いと言えます。
(ファイルの行数にもよりますが)
性能を悪化させるための故意の嫌がらせと受け取られても仕方がないでしょう。

この回答への補足

失礼致しました。
redim preserve 配列(lngCnt)はマイクロソフトより
指摘あり、redimを使用して既に速度改善済みになります。

補足日時:2003/09/29 12:05
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!