CSV行指定

タグの編集
投稿者 ダスティング  (高校生) 投稿日時 2016/2/17 16:39:29
予定表を作成しているのですが、下記のコードで順番に保存できるのですが、自分達が行いたいのは行」を指定してその場所に保存したいのです...。
どなたか教えていただけるとうれしいです。
理解しにくい文章ですみません...。

↓自分のコード 
Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click
        Try
            Dim csvPath As String = "予定.csv" '保存先のCSVファイルのパス
            Dim enc As System.Text.Encoding = System.Text.Encoding.GetEncoding("Shift_JIS")
            Dim sr As New System.IO.StreamWriter(csvPath, False, enc) '開く
            sr.WriteLine(ComboBox1.Text)
            sr.WriteLine(ComboBox2.Text)
            sr.WriteLine(TextBox1.Text)
            sr.WriteLine(ComboBox3.Text)
            sr.WriteLine(ComboBox4.Text)
            sr.WriteLine(TextBox2.Text)
            sr.WriteLine(ComboBox5.Text)
            sr.WriteLine(ComboBox6.Text)
            sr.WriteLine(TextBox3.Text)
            sr.WriteLine(ComboBox7.Text)
            sr.WriteLine(ComboBox8.Text)
            sr.WriteLine(TextBox4.Text)
            sr.WriteLine(ComboBox9.Text)
            sr.WriteLine(ComboBox10.Text)
            sr.WriteLine(TextBox5.Text)
            sr.Close()
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub
投稿者 kiku  (社会人) 投稿日時 2016/2/17 16:50:12
例えば、ComboBox1.Textを3行目に書きたい場合、
下記のようになります。
これで回答になっていますでしょうか?

Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click
         Try
             Dim csvPath As String = "予定.csv" '保存先のCSVファイルのパス
            Dim enc As System.Text.Encoding = System.Text.Encoding.GetEncoding("Shift_JIS")
             Dim sr As New System.IO.StreamWriter(csvPath, False, enc) '開く
             sr.WriteLine("")
             sr.WriteLine("")
             sr.WriteLine(ComboBox1.Text)
             sr.Close()
         Catch ex As Exception
             MsgBox(ex.Message)
         End Try
     End Sub 
投稿者 ダスティング  (高校生) 投稿日時 2016/2/17 16:58:35
返答ありがとうございます。
kikuさんのやり方でうまくできたのですが、自分達の予定では3万行になる予定です...。
最初に言っておけばよかったのですが配列を使って行指定はできるのでしょうか?
できれば配列を使ってやってみたいと思います...。



投稿者 魔界の仮面弁士  (社会人) 投稿日時 2016/2/17 21:48:23
既存のファイル(最大3万行)があり、その中の特定行を書き換えたいということでしょうか。
それとも、特定の位置に行を挿入したいということでしょうか。


「書き換え」だとしたら、置き換える前後のデータが完全に同じサイズの場合に限り
ファイルの部分的な上書きが可能です。

一方、書換え前後でデータサイズが異なる場合や、「挿入」が必要な場合は、
その行以降のデータすべてを再度書き出していかねばなりません。
(以前のデータを読み取り、再出力するコードが必要になる)


> 自分達の予定では3万行になる予定です...。

3 万行ということは、仮に 
1 行あたり平均 80 バイトだとすれば 約22MB、
1 行あたり平均 512 バイトだとすれば 約146MB
というサイズになりますね。

そのデータ全体を TextBox に表示したりするのでもない限り、
最近の PC スペックであれば大丈夫だと思います――多分。

ちなみに TextBox は、既定では文字数換算で3万2767文字が上限です。
(MaxLength プロパティを 0 にすれば、それ以上の入力が可能です)


> 最初に言っておけばよかったのですが配列を使って行指定はできるのでしょうか?

できますが、String 配列で管理した場合、行データの挿入操作などはむしろ面倒に
なりますので、併せて List(Of String) 等の利用も検討してみては如何でしょうか。


なお、既存のファイルを String の配列に読み込みたいのであれば、
System.IO.File の ReadAllLines メソッドを使えば OK です。

(必ずしも配列に拘らないなら、System.IO.File の ReadLines メソッドも使えるかも)
投稿者 shu  (社会人) 投稿日時 2016/2/18 09:44:02
3万行にもなるのならDBの使用を考えた方がよいかもしれません。
どうしてもテキストファイルでないと駄目ならすべての行の長さを固定にした
ものを使用されることを奨めます。そうすると
(行の長さ)×(行番号-1)でファイルの場所を特定することが出来るので
書き換えもスムーズになります。
挿入が発生するとすると挿入部以降の書き換えは避けられません。
投稿者 ダスティング  (高校生) 投稿日時 2016/2/18 16:05:15
なるほど...
ありがとうございます
容量が相当大きくなりそうなので教えていただいたDBというものを調べてみたいと思います。
まだ初心者なのでDBというものがわからいのです...
本当にありがとうございました。