CSVファイル出力の配列について への返答

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 shu  (社会人) 投稿日時 2013/10/18 09:25:07
> shu さんの書き込みに、
>
> > だとすると追記は出来ないので毎回ファイルの書き直しが必要になります。
>
> とありましたが、StreamWriter のコンストラクタの第2引数に True を指定すると、追記ができるようです。

そういうことではなくCSVの書き換え方が例で示したように途中への文字追加が
発生する可能性があるのであれば追記が出来ないということであってファイルへの追記機能が
ないということではありません。
例をもう少し書いて
6 button1
を書くと分かりやすかったかもしれませんね。

結局maroさんが行おうとしているCSVの書き換えがどのようになるのか分からないので
実際に追記が可能なのかはわかりません。
投稿者 zakiYoshi  (高校生) 投稿日時 2013/10/17 22:23:57
shu さんの書き込みに、

> だとすると追記は出来ないので毎回ファイルの書き直しが必要になります。

とありましたが、StreamWriter のコンストラクタの第2引数に True を指定すると、追記ができるようです。

Dim writer As New IO.StreamWriter("??????"True)

………(以下略)
投稿者 maro  (学生) 投稿日時 2013/10/17 21:53:07
HiDE-Adaさん

返答ありがとうございます。お返事遅くなり申し訳ないです。

書いて頂いたやり方でやってみたところ、きちんと配列されて出力されました。
本当に助かりました。
ご教授ありがとうございました!!
投稿者 HiDE-Ada  (社会人) 投稿日時 2013/10/17 16:46:44
だいぶ端折って書いたので、元はZakiYoshiさんが書かれた

>Dim writer As New IO.StreamWriter("?????")
>
>writer.WriteLine(Label1.Text)
>writer.WriteLine(Label2.Text)
> ………(省略)

>writer.Close()
>writer.Dispose()

の部分を
>writer.WriteLine(Label1.Text)
>writer.WriteLine(Label2.Text)
> ………(省略)


writer.WriteLine("{0},{1},{2},{3}",Label1.Text, Label2.Text, Label3.Text, Label4.Text)

にしてはどうですか、ということです。
投稿者 maro  (学生) 投稿日時 2013/10/17 10:09:37
HiDE-Adaさん、shuさんお返事ありがとうございました。まとめての返答でごめんなさい。


まず、どのような形でそれぞれLabelに数が入れられているかですが
ボタン自体はButton1とButton2の2種類です。
先ほどの例を使って説明すると

1←Label1(1回目にButton1と2どちらを押したか。2の場合-1が入力されます)
0←Label2(前回Button1と2どちらを押したか。1回目なので0が入っています)
0←Label3(Button1と2どちらかを"連続"で押すことの出来た回数)
1←Label4(Button1と2を押した総合計数)

となっています。

>ラベルの数、ボタンの数は4つなのでしょうか?
上記を見て頂ければお答えになっているかもしれませんが、ラベルは4つ、ボタンは2つで固定です。

> Writer.WriteLine(Label1.Text & "," & Label2.Text & "," & Label3.Text & "," & Label4.Text )
ごめんなさい、ちょっとわからなかったのですが、この形では上手く表示されないので
>Writer.WriteLine("{0},{1},{2},{3}",Label1.Text, Label2.Text, Label3.Text, Label4.Text)
を使った方が良いということでしょうか?後ほど自分でも試してみます。
投稿者 shu  (社会人) 投稿日時 2013/10/17 08:52:30
画面上の動きは以下のような感じでしょうか?

    ボタン         Label1                    Label2
 1  button1       1
 2  button2       1                           1
 3  button1       1, 2                        1
 4  button2       1, 2                        1, 2
 5  button2       1, 2                        1, 2, 3


CSVの内容
1のとき
  1

2のとき
 1, 1

3のとき
  1, 1
  2

4のとき  
  1, 1
  2, 2

5のとき
  1, 1
  2, 2
   , 3

のようになるのでしょうか?
だとすると追記は出来ないので毎回ファイルの書き直しが必要になります。



> Writer.WriteLine(Label1.Text & "," & Label2.Text & "," & Label3.Text & "," & Label4.Text )
についてですが
&ではなく+を使用するのは昔から出来ますが+は数値と一緒に使用した場合に文字列が数値へ
変換されてしまいバグのもとになるのでやめましょうということです。
1 + "2" => 3
1 & "2" => "12"
※1を文字列にすることがやりたいことが明確になり確実です。

またこの場合
Writer.WriteLine("{0},{1},{2},{3}",Label1.Text, Label2.Text, Label3.Text, Label4.Text)
と書いた方が&演算を複数書くことによる見にくさを回避できます。
投稿者 HiDE-Ada  (社会人) 投稿日時 2013/10/17 02:51:03
ラベルの数、ボタンの数は4つなのでしょうか?
4つで固定できるなら、

Writer.WriteLine(Label1.Text & "," & Label2.Text & "," & Label3.Text & "," & Label4.Text )
で1行に出力できると思います。今は&でなくて+でもよかったかも^^;
CSVの区切りを","としているので、TABならvbTab(だったかな)として下さい。

もし、一つのラベルに同時に1,2のような形で入るのであれば、
分割する必要がありますね。
投稿者 maro  (学生) 投稿日時 2013/10/17 01:05:10
ZakiYoshiさん

返答ありがとうございました!
早速その方法で出力したCVSをエクセル・メモ帳等で開いてみました。

A列
1←Label1
0←Label2
0←Label3
1←Label4

1←Label1
1←Label2
1←Label3
2←Label4


という形で出力されていました。
最初は全部繋がってしまっていたので、その時から比べると大分見やすくなったと思います。
ありがとうございました。
しかし、

A列 B列 C列 D列
1   0   0  1
1   1   1  2

という形には並べることは出来ないのでしょうか?もしありましたら教えて頂きたく思います。
何度も申し訳ありません。

よろしくお願いします。
投稿者 ZakiYoshi  (高校生) 投稿日時 2013/10/16 23:15:37
はじめまして、ZakiYoshi です。

>Button1ならA列,Button2ならB列に出力、というようにきちんと分けて出力するにはどうしたら良いですか。
質問どおりに答えるとしたら、

Dim writer As New IO.StreamWriter("?????")

Writer.WriteLine(Label1.Text)
Writer.WriteLine(Label2.Text)
 ………(省略)

Writer.Close()
Writer.Dispose()

とすればよいと思います。

StreamWriter.WriteLine メソッドで書き込むと、文字列の最後に自動的に 改行がはいるので、これで問題ないはずです。
投稿者 maro  (学生) 投稿日時 2013/10/16 19:36:07

すみません、上手く検索出来ずに困っています。
初心者で、あまりよくわかっていないのですがBottun1を押した時ラベル1に1,2,…と値(全て数字です)が入っていく物が複数あります(Button2を押した場合ラベル2に1,2…と入るなど)それらのラベルに入った値を1つのCSVファイルとして出力したいのですが、全て同じ行に入って1列で出てきてしまいます。
Button1ならA列,Button2ならB列に出力、というようにきちんと分けて出力するにはどうしたら良いですか。
こちらのサイトを参考に

Dim Writer As New IO.StreamWriter("C\VB\alternation.csv")
Writer.WriteLine(Label1.Text)

Writer.Close()

という形で出力するところまでは出来たのですが、配列が上手く行きません。
初歩的な質問で申し訳ありませんがよろしくお願い致します。

VB2010 Expressを使用しています。