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

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

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

Re[5]: 2次元配列をcsvを使って保存


(過去ログ 134 を表示中)

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

■79250 / inTopicNo.1)  2次元配列をcsvを使って保存
  
□投稿者/ ポン吉 (1回)-(2016/03/18(Fri) 13:27:51)

分類:[.NET 全般] 

私は今、題名からもわかるように、2次元配列をcsvに保存する方法を調べています。ですが調べてもその方法がわかりません。私がやりたいのは以下のことです

textboxにtextをうちこみ、csvに保存するためのボタンを押す。
 ↓
2次元配列に新たに保存されているところだけを同じ座標でcsvファイルに上書きで書き込む

といったものです。よろしければこれのやり方をお教えください。
引用返信 編集キー/
■79251 / inTopicNo.2)  Re[1]: 2次元配列をcsvを使って保存
□投稿者/ ポン吉 (2回)-(2016/03/18(Fri) 13:32:43)
一応コードも載せておきますね
Public Class Form2



Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Me.Width = Screen.GetWorkingArea(Me).Width
Me.Location = New Point(0, 400)
Label1.Text = Form1.Label50.Text
Label2.Text = Form1.Label53.Text
Label3.Text = Form1.j & "日"
Button6.Hide()
Label4.Hide()
End Sub

Private Sub Label1_Click(sender As Object, e As EventArgs) Handles Label1.Click

End Sub

Private Sub Label2_Click(sender As Object, e As EventArgs) Handles Label2.Click

End Sub

Private Sub Label3_Click(sender As Object, e As EventArgs) Handles Label3.Click

End Sub

Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
TextBox1.Show()
Button5.Show()
Button6.Show()
Label5.Hide()
Label6.Hide()
End Sub


Private Sub Button5_Click(sender As System.Object, e As System.EventArgs) Handles Button5.Click
Dim hiduke(1211, 30) As String '2次元配列を使って日記を保存
Dim tukiString As String = Label2.Text 'left関数を使うために数値化したやつ
Dim hinitiString As String = Label3.Text 'left関数を使うために日付を数値化したやつ
Dim tosi As Integer = Integer.Parse(Mid(Label1.Text, 2, 3)) * 12 '年
Dim tuki As Integer = Integer.Parse(Microsoft.VisualBasic.Left(tukiString, Len(tukiString) - 1)) '月
Dim hiniti As Integer = Integer.Parse(Microsoft.VisualBasic.Left(hinitiString, Len(hinitiString) - 1)) '日にち
Dim kizyutu As String

hiduke(tosi + tuki, hiniti) = TextBox1.Text
MsgBox(hiduke(tosi + tuki, hiniti), vbOKOnly, "書き込みが完了しました")
kizyutu = hiduke(tosi + tuki, hiniti).Clone

End Sub

Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click
Dim hiduke(1211, 30) As String '2次元配列を使って日記を保存
Dim tukiString As String = Label2.Text 'left関数を使うために年を数値化したやつ
Dim hinitiString As String = Label3.Text 'left関数を使うために日付を数値化したやつ
Dim tosi As Integer = Integer.Parse(Mid(Label1.Text, 2, 3)) * 12 '年
Dim tuki As Integer = Integer.Parse(Microsoft.VisualBasic.Left(tukiString, Len(tukiString) - 1)) '月
Dim hiniti As Integer = Integer.Parse(Microsoft.VisualBasic.Left(hinitiString, Len(hinitiString) - 1)) '日にち
Dim kizyutu As String

MsgBox(kizyutu, vbOKOnly, "過去の記述")

End Sub
End Class
引用返信 編集キー/
■79252 / inTopicNo.3)  Re[1]: 2次元配列をcsvを使って保存
□投稿者/ 魔界の仮面弁士 (671回)-(2016/03/18(Fri) 14:08:59)
No79250 (ポン吉 さん) に返信
> 分類:[.NET 全般] 
言語指定(VB とか C# とか C++ とか)が無いようですが
どの言語で回答されても問題ありませんか?


> 題名からもわかるように、2次元配列をcsvに保存する方法を調べています。
本文の「csvに保存」と
題名の「csvを使って保存」では、
意味が変わってくるような…。


> ですが調べてもその方法がわかりません。
やりたい事は分かりましたが、肝心の質問内容が書かれていないようです。

やりたい事だけでなく、「何を知りたいのか、何が分からないのか」も書いてみてください。

たとえば:
二次元配列というのがどのような物なのかを理解していないのか、
二次元配列は使っているけれど、その中身を取り出すループの書き方で戸惑っているのか、
二次元配列の読み書きは問題ないが、ファイルに出力する方法が分からないのか、
ファイルへの出力方法は調べられたが、期待するものとは異なる結果になってしまうのか…。


何を調べてみて、その資料の中のどの部分が分からなかったが明確になっていると、
こちらとしても回答しやすいです。


> 2次元配列に新たに保存されているところだけを同じ座標でcsvファイルに上書きで書き込む
座標というのは、何行目の何列目、という意味でしょうか。

CSV はシーケンシャルなファイルなので、データの一部だけを
上書きする事は出来ません。(固定長データならランダムアクセスできるのですが)

CSV ファイルを作成するのであれば、
 ・既存のファイルの末尾に追記する。
 ・ファイルを最初から作りなおす。
の二択になります。

ですからこの場合、既存のデータの一部だけを変更したデータを用意し、
それを先頭から再出力することで、上書きの代用としてみてください。


> よろしければこれのやり方をお教えください。

2次元配列の内容を csv ファイルに保存するのだとしたら、その配列というののは

 data( 行, 列 )
 data( x, y )

のどちらの形式で保持されているのでしょうか。
(両者は縦横の並びが異なりますよね)


また、その配列の内容は整数なのでしょうか。文字列でしょうか。あるいはそれ以外?

配列内にどんなデータが入っていて、それをどのような csv にしたいのかが
『具体的』なデータを交えたサンプルがあると、回答しやすいです。


特に CSV の場合、そのフォーマットは非常に曖昧です。
たとえば改行。CR を使うのか、LF を使うのか、CRLF を使うのか。
また、どこに改行を置くのかなど。
 パターン1「aa,bb,cc{改行}xx,yy,zz{改行}」 … レコードの末尾で改行
 パターン2「aa,bb,cc{改行}xx,yy,zz」 … 行末で改行


また、データの両端を引用符で囲って、各行が
 「"aa","bb","cc"」
のようになるパターンもあるでしょう。中には、
 「"aa",123,#3/15/2016#」
のように「文字列はダブルクォートで囲む」「数字は囲まない」「日付は#囲み」
などと、異なるフォーマットを要する処理系さえあります。

また空データに対して
 「"aa","","cc"」
 「"aa",,"cc"」
のどちらの形式を取るのか、とか、そのほかにも
 ・ヘッダー行を付与するのか否か
 ・改行やカンマ、ダブルクォートを含むデータの扱い方
 ・文字コードは Shift_JIS か UTF-8 か
 ・その文字コードで扱えない文字が出現した場合にどうするのか
などなど。
引用返信 編集キー/
■79253 / inTopicNo.4)  Re[2]: 2次元配列をcsvを使って保存
□投稿者/ 魔界の仮面弁士 (672回)-(2016/03/18(Fri) 14:36:35)
> 一応コードも載せておきますね

おろ。回答書いている間にコードが投稿されていたようで。


> Dim tukiString As String = Label2.Text 'left関数を使うために数値化したやつ
Label2 の Text は、デザイン時に固定的に指定しているのでしょうか。
それとも、ここには書かれていない範囲のコードで書き換えているのでしょうか。


> Private Sub Button5_Click(sender As System.Object, e As System.EventArgs) Handles Button5.Click
>  Dim hiduke(1211, 30) As String '2次元配列を使って日記を保存
ここで宣言した変数(ローカル変数)は、Button5_Click の処理内でのみ有効であり、
Button5_Click の処理が始まるたびに作成・初期化され、
End Sub 到達時には破棄されてしまいますが、その点は大丈夫でしょうか。


フォームを開いている間、変数がクリアされないようにしたいのであれば、
このブロックの外側で変数を宣言してみてください。(フィールド変数)

あるいは本当に、ボタンを押したときだけ使う変数だというのであれば、
提示のコードでは配列を使う必要は無さそうです。というのも、
hiduke(tosi + tuki, hiniti) = TextBox1.Text
MsgBox(hiduke(tosi + tuki, hiniti), vbOKOnly, "書き込みが完了しました")
  kizyutu = hiduke(tosi + tuki, hiniti).Clone
というコードは、hiduke 配列の他の要素は使用していないため、実施的には、
  Dim sHiduke As String = TextBox1.Text
  MsgBox(sHiduke, vbOKOnly, "書き込みが完了しました")
  Dim kizyutu AS String = sHiduke
程度の意味しかないためです。


> Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click
> Dim hiduke(1211, 30) As String '2次元配列を使って日記を保存
こちらに至っては、そもそも hiduke 変数自体が使われていないようですね。


現状のコードを見る限りに、読み取ったデータを
集計したりしているわけでもないようですし、全件読み出して
『二次元配列』に蓄えておく必要は無さそうです。

配列処理にこだわらず、逐次処理に切り替えてみては如何でしょうか?


【案1】
(1) 既存の CSV を別名にリネーム
(2) 元の CSV ファイル名でファイルを新規作成
(3) リネームした既存 CSV を一行読み取る
(4) それが上書きしたい該当行で無いなら、それを無加工で新規ファイルに書き込む
  上書きしたい行ならば、新しいデータを代わりに書き込む
(5) 手順 3 に戻り、既存 CSV の次の行を読み取っては、別ファイルの書き出していく
(6) 最後まで読み取ったら、既存CSVと一時ファイルの両方を閉じる
(7) リネームした既存CSVを削除する

【案2】
(1) 既存の CSV を開く
(2) 別名の一時ファイルを新規作成
(3) 既存 CSV を一行読み取る
(4) それが上書きしたい該当行で無いなら、一時ファイルに追記
  上書きしたい行なら、新しいデータを一時ファイルに追記
(5) 手順 3 に戻り、既存 CSV の次の行を読み取る
(6) 最後まで読み取ったら、既存CSVと一時ファイルの両方を閉じる
(7) 既存CSVを削除する
(8) 一時ファイルのファイル名を既存ファイルと同じ名前にする
引用返信 編集キー/
■79254 / inTopicNo.5)  Re[2]: 2次元配列をcsvを使って保存
□投稿者/ shu (846回)-(2016/03/18(Fri) 14:37:47)
No79251 (ポン吉 さん) に返信

マルチポスト先
http://rucio.cloudapp.net/ThreadDetail.aspx?ThreadId=27035
引用返信 編集キー/
■79256 / inTopicNo.6)  Re[3]: 2次元配列をcsvを使って保存
□投稿者/ ポン吉 (3回)-(2016/03/18(Fri) 15:03:50)
お騒がせしてすみませんでした(-_-;)
マルチポスト先のvb中学校で自分がやりたいことの回答がいただけました。
皆様せっかく返信していただいたのにすみませんでしたm(__)m
解決済み
引用返信 編集キー/
■79257 / inTopicNo.7)  Re[4]: 2次元配列をcsvを使って保存
□投稿者/ WebSurfer (868回)-(2016/03/18(Fri) 16:22:14)
No79256 (ポン吉 さん) に返信
> お騒がせしてすみませんでした(-_-;)
> マルチポスト先のvb中学校で自分がやりたいことの回答がいただけました。
> 皆様せっかく返信していただいたのにすみませんでしたm(__)m

一度「マルチポスト」でググってヒットした記事を読んでもらって、それが
どういうことか、マナー的にはどうなのか、今後のために考えていただけま
せんか?

解決済み
引用返信 編集キー/
■79258 / inTopicNo.8)  Re[5]: 2次元配列をcsvを使って保存
□投稿者/ ポン吉 (4回)-(2016/03/18(Fri) 16:54:57)
No79257 (WebSurfer さん) に返信
> ■No79256 (ポン吉 さん) に返信
>>お騒がせしてすみませんでした(-_-;)
>>マルチポスト先のvb中学校で自分がやりたいことの回答がいただけました。
>>皆様せっかく返信していただいたのにすみませんでしたm(__)m
>
> 一度「マルチポスト」でググってヒットした記事を読んでもらって、それが
> どういうことか、マナー的にはどうなのか、今後のために考えていただけま
> せんか?

はい、今回は本当にすみませんでした。今後2度とこのようなことはないように気を付けます
引用返信 編集キー/


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

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -