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

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

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

多項目にてのCSVファイルの書き込みについて

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

■98076 / inTopicNo.1)  多項目にてのCSVファイルの書き込みについて
  
□投稿者/ ゆい (1回)-(2021/09/11(Sat) 13:59:08)

分類:[VB.NET/VB2005 以降] 

超初心者ですみません。
VB2017です。

質問は下記の「sr.WriteLine(a(i) & "," & b(i))」の部分です。
今はa(i)、b(i)の2つなのですが、これが数百とも続けば、いちいち全てを書くのにも大変。
何か良い方法でもあればお願い出来ないでしょうか?

        Dim sfile As String = "C:\Users\***\***\test.csv"
        Using sr As New System.IO.StreamWriter(sfile, False, System.Text.Encoding.Default)
            For i = 0 To 100
                sr.WriteLine(a(i) & "," & b(i)) <---ここがまだ数百と続く時。
             Next
            sr.Close()
        End Using

引用返信 編集キー/
■98077 / inTopicNo.2)  Re[1]: 多項目にてのCSVファイルの書き込みについて
□投稿者/ WebSurfer (2342回)-(2021/09/11(Sat) 15:17:08)

> 今はa(i)、b(i)の2つなのですが、これが数百とも続けば、いちいち全てを書くのにも大変。
> 何か良い方法でもあればお願い出来ないでしょうか?

何からその「a(i)、b(i)」とかを取得してくるのですか? 「良い方法」はそれによってそれぞれ
だと思いますよ。
引用返信 編集キー/
■98078 / inTopicNo.3)  Re[2]: 多項目にてのCSVファイルの書き込みについて
□投稿者/ ゆい (2回)-(2021/09/11(Sat) 15:55:39)
No98077 (WebSurfer さん) に返信

> 何からその「a(i)、b(i)」とかを取得してくるのですか? 「良い方法」はそれによってそれぞれ
> だと思いますよ。

取得とはこれを読み込んでのことですか?
だったらそうなります。

引用返信 編集キー/
■98079 / inTopicNo.4)  Re[3]: 多項目にてのCSVファイルの書き込みについて
□投稿者/ WebSurfer (2343回)-(2021/09/11(Sat) 16:20:11)
No98078 (ゆい さん) に返信

> 取得とはこれを読み込んでのことですか?
> だったらそうなります。

話が通じてません。元データはどこから取ってくるのかという質問です。

例えば SQL Server のテーブルからデータを取ってくるなら、アプリを作らなくても
SSMS を使えば容易に可能だし、どうしても自分でアプリを作りたいということであっ
ても、ADO.NET を使うとかそれなりの作り方があるということです。
引用返信 編集キー/
■98080 / inTopicNo.5)  Re[4]: 多項目にてのCSVファイルの書き込みについて
□投稿者/ ゆい (3回)-(2021/09/11(Sat) 17:45:50)
No98079 (WebSurfer さん) に返信

元データは自作で作ったものです。

> 話が通じてません。元データはどこから取ってくるのかという質問です。
>
> 例えば SQL Server のテーブルからデータを取ってくるなら、アプリを作らなくても
> SSMS を使えば容易に可能だし、どうしても自分でアプリを作りたいということであっ
> ても、ADO.NET を使うとかそれなりの作り方があるということです。
引用返信 編集キー/
■98081 / inTopicNo.6)  Re[5]: 多項目にてのCSVファイルの書き込みについて
□投稿者/ WebSurfer (2344回)-(2021/09/11(Sat) 18:31:13)
No98080 (ゆい さん) に返信

> 元データは自作で作ったものです。

それしか情報が提供できないのであれば、ここに書いてあること以外は知る由もない第三者の
自分には、あなたが満足できる「良い方法」は提案できないです。

エスパー回答者とか、手取り足取り教えてくれる面倒見の良い回答者をお待ちいただくのが
良さそうです。

引用返信 編集キー/
■98082 / inTopicNo.7)  Re[1]: 多項目にてのCSVファイルの書き込みについて
□投稿者/ ゆい (4回)-(2021/09/11(Sat) 18:55:55)
この方が分かり易いかもしれませんので訂正をさせていただきます。
 
  sr.WriteLine(a0(i) & "," & a1(i) & "," & ・・(省略)・・ a499(i) & "," & a500(i)) 

> 超初心者ですみません。
> VB2017です。
>
> 質問は下記の「sr.WriteLine(a(i) & "," & b(i))」の部分です。
> 今はa(i)、b(i)の2つなのですが、これが数百とも続けば、いちいち全てを書くのにも大変。
> 何か良い方法でもあればお願い出来ないでしょうか?
>
> Dim sfile As String = "C:\Users\***\***\test.csv"
> Using sr As New System.IO.StreamWriter(sfile, False, System.Text.Encoding.Default)
> For i = 0 To 100
> sr.WriteLine(a(i) & "," & b(i)) <---ここがまだ数百と続く時。
>   Next
> sr.Close()
> End Using
引用返信 編集キー/
■98083 / inTopicNo.8)  Re[2]: 多項目にてのCSVファイルの書き込みについて
□投稿者/ WebSurfer (2345回)-(2021/09/11(Sat) 19:33:20)
No98082 (ゆい さん) に返信
> この方が分かり易いかもしれませんので訂正をさせていただきます。
>  
>   sr.WriteLine(a0(i) & "," & a1(i) & "," & ・・(省略)・・ a499(i) & "," & a500(i)) 

それでは何ともならないので、コードで文字列を組み立てることができるように
配列の作り方を考え直してはいかがですか?

「元データは自作で作ったものです」ということならそのあたりは何とでもなり
そうな気がしますけど?
引用返信 編集キー/
■98086 / inTopicNo.9)  Re[2]: 多項目にてのCSVファイルの書き込みについて
□投稿者/ 魔界の仮面弁士 (3177回)-(2021/09/11(Sat) 20:06:13)
No98082 (ゆい さん) に返信
>   sr.WriteLine(a0(i) & "," & a1(i) & "," & ・・(省略)・・ a499(i) & "," & a500(i)) 

sr という名前だと、
StreamWriter というよりは
StreamReader を連想してしまいそう…。



さて。

a0 や a500 が何を指しているのかが一切説明されていませんが、
それらを別々の変数として分けて管理しているのは何故ですか?
501 列あるからといって、501 個も変数を用意したら管理しにくいですよね。

たとえばそれらの変数が、文字列型の一次元配列だとすれば
それぞれを別々の変数で管理するのではなく、
 Dim a0() As String = {"0行目0列目", "1行目0列目", "2行目0列目"}
 Dim a1() As String = {"0行目1列目", "1行目1列目", "2行目1列目"}
 Dim a2() As String = {"0行目2列目", "1行目2列目", "2行目2列目"}
 Dim a3() As String = {"0行目3列目", "1行目3列目", "2行目3列目"}

まとめて 1 つの配列やコレクションで管理するようにしてみてください。
たとえば、こんな感じの 2 次元配列にすることを考えてみます。
 Dim a(,) As String = {
  {"0行目0列目", "1行目0列目", "2行目0列目"},
  {"0行目1列目", "1行目1列目", "2行目1列目"},
  {"0行目2列目", "1行目2列目", "2行目2列目"},
  {"0行目3列目", "1行目3列目", "2行目3列目"}
}

こうすると、元の
 For rowIndex = 0 To 最大行
  sr.WriteLine(a0(rowIndex) & "," & a1(rowIndex) & "," & a2(rowIndex) & "," & a3(rowIndex)) 
 Next
という処理を
 Dim maxCol As Integer = a.GetUpperBound(0) '最大列番号。今回は 3 が返される
 Dim maxRow As Integer = a.GetUpperBound(1) '最大行番号。今回は 2 が返される。
 For rowIndex = 0 To maxRow
  sr.Write(a(rowIndex, 0)) '最初の列
  For colIndex = 1 To maxCol
   sr.Write("," & a(rowIndex, colIndex)) '2番目以降の列はカンマを伴う
  Next
  sr.WriteLine("") '行末に改行
 Next
のように書き替えられます。


記述量はかなり増えたように見えますが、二次元配列の縦横のサイズが変化したとしても、
maxCol と maxRow の値がそれに連動して変わるので、出力部のコードを一切修正せずに済みます。

また、上記は「a(行, 列)」の並びで管理していますが、
入れ替えて「a(列, 行)」で管理しても構いません。


あるいは出力部をもう少し単純化させたいなら、元のデータをジャグ配列にするのも手です。

 Dim a()() As String = {
  New String() {"0行目0列目", "0行目1列目", "0行目2列目"},
  New String() {"1行目0列目", "1行目1列目", "1行目2列目"},
  New String() {"2行目0列目", "2行目1列目", "2行目2列目"},
  New String() {"3行目0列目", "3行目1列目", "3行目2列目"}
 }

この場合は、二次元配列よりもさらに簡単で
 For Each cols As String() In a
   sr.WriteLine( String.Join( ","c, cols) )
 Next
だけで済みます。
ただしこちらは、「a(行)(列)」での管理が必要であり、a(列)(行) にはできません。


なお「配列」の場合、あらかじめ行数や列数が分かっていないと扱い辛い面があります。
行数が可変な場合は、DataTable や List(Of ) を使って管理することを検討しましょう。


どの方法をとるにしても、沢山のデータをまとめて処理したいのであれば
「それぞれのデータのために、変数を沢山用意する」のではなく、
「沢山のデータを入れるためのコレクション変数を一つだけ用意する」ことが肝心です。
引用返信 編集キー/
■98087 / inTopicNo.10)  Re[3]: 多項目にてのCSVファイルの書き込みについて
□投稿者/ ゆい (5回)-(2021/09/11(Sat) 22:29:54)
No98086 (魔界の仮面弁士 さん) に返信

魔界の仮面弁士 様 
ありがとうございます。

sr という名前、何の意味もないのですよ(笑)

> それらを別々の変数として分けて管理しているのは何故ですか?
実際には二次元配列にもする積りでしたが、そこまで考えずに質問もしてしまいました^^;

> 「沢山のデータを入れるためのコレクション変数を一つだけ用意する」ことが肝心です。
そうですよね、そこを教えてもいただきたかったのです。
だからピッタリ。。
でも凄い! こんなことが出来るなんて!!
ありがとうございました。
早速にも使わせていただきますm(._.)m






解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


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

このトピックに書きこむ