• ベストアンサー

配列の格納方法

VBEXPRESS超初心者です。配列を格納する方法を調べたらHELPで、 Dim players() As String = {"Dan", "Fred", "Bart", "Carlos", _ "Ty", "Juan", "Jay", "Sam", "Pedro"} Dim i As Integer = CInt(Textbox1.Text) MsgBox(players(i) & " is on first base.")とありましたが、 100行のCSVまたはTxtデータをいちいち””で書かなくても格納する方法はどうすればいいのですか?  基本的なことですいません。 なかなかHelpだけではひとつを知るのに丸一日費やしますので当分の間ご勘弁ください。  

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

  • ベストアンサー
  • Hardking
  • ベストアンサー率45% (73/160)
回答No.1

テキストファイルの参照データを配列変数に格納する プログラムコーディング例を下記します。 今回はデータ件数は不定ということで 静的配列変数ではなく、動的配列変数の処理とします。 Dim fname As String 'ファイル名 Dim fno As Integer 'ファイル番号 Dim idx As Integer '添え字 Dim data() As String 'データ格納用配列変数 idx = 0 fname = "c:\test.txt" fno = FreeFile() FileOpen(fno, fp, OpenMode.Input) While Not EOF(fno) '1行読み込む度に配列の要素数を増やす ReDim Preserve data(idx + 1) '配列変数へデータ格納 data(idx) = LineInput(fno) idx = idx + 1 End While FileClose(fno) 以上。

bolnf38
質問者

お礼

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

bolnf38
質問者

補足

早速皆さんからご返事をいただき恐縮です。 具体例をはじめ配列について薀蓄のあるお話まで寄せていただき 何とお礼を申し上げてよいかわかりません。  まだ、ヘルプを読めば読むほど混沌の大海に ひきずりこまれて暗中模索状態です。 HardKing様の例を試してみたのですが名前fpが宣言されていません エラーが出るのでfpをfnameに変えてうまくいきました。  といっても、データの表示方法でつまずいています。 DataGridViewが最も適切と思い、ヘルプを漁っていますが、シンプルな 素人向けの解説にヒットしません。DataGridView.Item=data というように単純にできたらよさそうなものですが。 仕方なくLabel1.Text=dataで、エラーが出るので Label1.Text=data()でもだめ、Label1.Text=data(0) Label1.Text=data(1)ひとつづつ行って、データの格納を 確認しました。RichText1.Text=dataでデータの全体が 表示されないのがどうもわかりません。 お手数ですが できればこの辺りも解説していただけませんでしょうか。

その他の回答 (3)

回答No.4

不定長の配列の使い方。 '■配列変数の宣言 Dim players() As String 不定長なのでサイズは書かない。 サイズが決まってればplayers(10)みたいに書くんですけどね。 ファイルから読むということはサイズが不明なので、書きません。 '■配列長をカウントするための整数型変数も宣言しておく Dim cnt As Integer = 0 まずは初期化もしておく。しなくても0だけど。 '■サイズを変更 ReDim Preserve players(cnt) 「ReDim」は、配列の大きさを再定義するときに使います。 上のように書くと、playersという配列が0からcnt番目まで使えるようになります。 「Preserve」を付けると、その再定義するまでに入っている値が初期化されません。 付けないと、全く新しい配列として再定義されてしまいます。 例) players(0)の中に"A" players(1)の中に"B" とあるときに ReDim players(2)とすると・・・ players(0)の中に"" players(1)の中に"" players(2)の中に"" って感じにはじめ入ってた値が消えてしまうのです。 ReDim Preserve players(2)なら、 players(0)の中に"A" players(1)の中に"B" players(2)の中に"" となります。 これをファイルを読みながら行っていくのです。 まとめると・・・。 Dim players() As String Dim cnt As Integer = 0 Dim sr As System.IO.StreamReader 'テキストファイルをオープン sr = New System.IO.StreamReader("C:\test.csv") ’テキストファイルの終わりまでループ Do Until sr.EndOfStream ’配列の数をインクリメント cnt = cnt + 1 ’配列の領域を1つ増やす(Preserveを忘れずに!) ReDim Preserve players(cnt-1) ’テキストファイルから一行読み込んだ結果を配列にセット players(cnt-1) = sr.ReadLine Loop ’テキストファイルをクローズ sr.Close 表示について困っていらっしゃるようですが、ここでの質問は配列についてでしたので、DataGridViewについてはまた別で質問された方がよろしいかと思われます。 が。 ここまで配列について説明しておいてなんですが、CSVをDataGridViewに表示するというコードが見つかりましたので参考URLに紹介しておきます。配列に読む必要は無いみたいですよ?

参考URL:
http://www.vbstation.net/tips/datagridview_csv.htm
bolnf38
質問者

お礼

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

bolnf38
質問者

補足

第2の方法を提示していただき大変参考になりました。 ///////////////// Hardkingさん式を元に比較のため変数名などを少し変更しています Dim fname As String = "c:\test.txt" Dim fno As Integer = FreeFile() Dim cnt As Integer = 0 Dim data() As String FileOpen(fno, fname, OpenMode.Input) While Not EOF(fno) ReDim Preserve data(cnt + 1) data(cnt) = LineInput(fno) cnt = cnt + 1 End While FileClose(fno) TextBox1.Text = data(0) TextBox2.Text = data(1) /////////////////// Penpenpenさん式を元に比較のため変数名などを少し変更しています Dim cnt As Integer = 0 Dim sr As System.IO.StreamReader Dim data() As String sr = New System.IO.StreamReader("C:\test.txt") Do Until sr.EndOfStream ReDim Preserve data(cnt) data(cnt) = sr.ReadLine      cnt = cnt + 1 Loop sr.Close() TextBox1.Text = data(0) TextBox2.Text = data(1) While Notを使うか、Do Loopを使うかの違い FileOpenを使うかStreamReaderを使うかの違い どちらもVBEEで正常にできましたが、いろいろな方法があるものですね 大変勉強になりました。 >>DataGridViewについてはまた別で >>質問された方がよろしいかと思われます そうですね。うっかりしてました。 解説ページを紹介していただきありがとうございました。 参考にしてみたいと思います。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.3

本質問は、配列にデータを設定する方向での、質問で、回答はその方向での回答です。 しかし、言語の解説書には書いてないが、経験者には、何をいまさら ということだが、大切と思う方向を書いてみます。このことを 常に考えて置くと、為になると思う。 私の個人的な経験から言えば、大昔のコンピュタはメモリが少なく、メモリに大量にデータを溜め込まないように、極力ロジックを考えるのが良きプログラマでした。しかし、今は使い放題であるため、考える必要が無くなった面があり、初心者はすぐ莫大な量の配列を使おうとするのではないかと思います。 配列は要素を指定すれば、ランダム検索ができるし、便利なんですが、 (1)全(といっても適当な一部にせざるを得ない場合もある)データを配列などに納めないとダメな処理と    例えばソート(並べ替え)、順位づけ (2)今読んだデータを、今までの合計に加える、新しい中間的合計を出せばよいような処理とあります。 例えば合計、平均、標準偏差、最大、最小など結果が1つのものに多い。 また読んだレコードを1行ずつ逐次印刷するなどの処理もある。 そのほかに (3)全ての検索データを、プログラムの初めに配列に読む込むのでなく、必要な都度、キー項目で、ファイルを読んでデータを得るという処理でよい場合もある。 その場合はデータベースシステムの検索機能に頼る場合があります。 そのためには、データベースシステムが複雑な構造を持ち込み、処理をしますが、プログラムコード上は記述は簡単です。 (4)エクセルのように、セルが配列のような概念で考えることができるものは、配列に読み込まなくても、セルのデータの処理として 処理できる。 (5)配列は、コンピュタ電源が切れると、記憶されないので   プログラムにデータをなるべく持たせないという主義から、   少し大量になると、 ディスクー>配列、配列ー>ディスク   を初めと終わりに行う必要がある場合があります。 また使用頻度によっては(3)が時間面で、経済的な場合もあります。

bolnf38
質問者

お礼

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

noname#41855
noname#41855
回答No.2

やり方はいろいろありますが・・・ 単純なのは、Dim players(100) As String などとして空の配列を用意し、FileOpen,Input(またはLineInput),FileCloseなどの関数を使ってファイルから読み取って配列に格納する方法です。 それぞれの関数の使い方はヘルプを見てください。 > なかなかHelpだけではひとつを知るのに丸一日費やしますので 初心者の頃はそんなもんです。 調べる手間を惜しんでいたら永遠に初心者のままです。 頑張ってください。

bolnf38
質問者

お礼

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

関連するQ&A

専門家に質問してみよう