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

タグの編集
投稿者 みつば  (学生) 投稿日時 2008/12/23 05:47:16
VB2005を使っています.
CSVファイル(エクセル)の指定行のデータを読み込んで表示させるという事はできたのですが,
CSVファイルの指定行にデータを書き込むということができずに行き詰っています.


CSVファイル内に次のようなデータが存在します(カンマはエクセルの列が一つ右にずれる事をあらわします)

1,A,B,C     ’1行目
2,D,E,F     ’2行目
3,G,H,I     ’3行目

この場合,読み込むときに1列目が1のとき2,3,4列目を取得するというふうにして,変数X,Y,ZにそれぞれA,B,Cと取得できます.
しかし,この取得したデータをX=C,Y=B,Z=Aと変更して1行目に
1,C,B,A
と書き込もうとするのですが,うまく行きません.
最初の行だとか最後の行に追加ということはできるのですが,指定した(条件にあった)行に上書するということができずにいます.
良い方法があればご教授願いたいと思います.
投稿者 るしぇ  (社会人) 投稿日時 2008/12/23 19:26:50
テキストファイル(CSVの実体はテキストファイルです)というのは
1行の文字列データだと思ってください。
改行も、改行コードという文字列です。
(エディタが表示するときに次の行に表示しているだけ)

ですから、ファイルの最後に追記することは出来ますが、
途中に挿入したい場合は、そのデータ以降を全てずらす必要が
出てきてしまいます。
このため、先頭から全てのデータを書き直す処理になっています。

例外として固定長がありますが、VB.NET になってから
固定長文字列がサポートされていませんので説明は省略します。
投稿者 neptune  (社会人) 投稿日時 2008/12/24 01:19:09
こんにちは

基本的にはるしぇさんのおっしゃる通りなんですが、
>CSVファイル(エクセル)の指定行のデータを読み込んで表示させるという事はできたのですが,
で、どのように読み込んでいるかの情報が欠落してますので、一応例外を書いておきますと、
ADO.netを利用して読み込んでいる場合は、追加と変更はできます。
詳しくは
http://support.microsoft.com/kb/316934/
をどうぞ。

但し、ExcelにADOで接続すると、別のメモリ開放関係の不具合もありますのでお勧めはしません。
投稿者 みつば  (学生) 投稿日時 2008/12/24 02:04:36
るしぇ様、neptune様早速の返信ありがとうございます。

読み込みの方法ですが、表現が適切であるか微妙だったのですが、指定行とさせていただいていましたが実際は下記のように全ての行を読み取り、IF文で一致する行をカンマ区切りで変数に取得するというような形です。以下のようにしています

Dim read As New System.IO.StreamReader(Name, System.Text.Encoding.Default)
Do Until reader.EndOfStream
  line = read.ReadLine
  BASHO = line.Split(",")
       If BASHO(0) = A(1) Then
          X(1) = BASHO(1)
          Z(1) = BASHO(2)
       End If
 Loop

以上の様にして、場所から値を変数に入れることが出来たので、逆も簡単に出来てしまう物だと思っていました。
プログラム側からでは難しいようなので、ファイルを分割するなどの対応をしてみたいと思います。テキストファイルの本質すら分かっていなかったことが恥ずかしい限りです。
なにかこうすればいいということがあればご教授ください。よろしくお願いします。
投稿者   (社会人) 投稿日時 2008/12/24 05:28:11
大したサイズでないなら
①全部読み込む
②任意の行を変更
③全部書き出す
でいいんじゃない

全部読む、全部書くのはそれぞれSystem.IO 名前空間のFile.ReadAllLinesメソッドと
File.WriteAllLinesメソッドが楽チンでお勧め。

[参考]
http://msdn.microsoft.com/ja-jp/library/system.io.file.readalllines(VS.80).aspx
http://msdn.microsoft.com/ja-jp/library/system.io.file.writealllines.aspx
投稿者 るしぇ  (社会人) 投稿日時 2008/12/24 20:31:36
>Dim read As New System.IO.StreamReader(Name, System.Text.Encoding.Default)
StreamReader を使う場合は、StreamWriter を使っておく方が手法が統一されてて
良いでしょう。
[方法 : Visual Basic で StreamWriter を使用してテキストをファイルに書き込む]
http://msdn.microsoft.com/ja-jp/library/hxwfzt61(VS.80).aspx

手段が複数あって迷うところだと思いますが、
>全部読む、全部書くのはそれぞれSystem.IO 名前空間のFile.ReadAllLinesメソッドと
>File.WriteAllLinesメソッドが楽チンでお勧め。
File クラスには使えるメソッドがまとめられていますし、こちらを採用する
のも良いと思います。
投稿者 レオ♪  (小学生) 投稿日時 2008/12/24 20:56:39
上級者のようなので、自分でオリジナルのData読み書きルーチンを作ったら?
システムにたよりすぎな感じ。
CSVとか関係ナッシング。