• ベストアンサー

CSVファイル操作

VBでCSVを操作しているのですが、わからないことがあるので教えてください。 1.CSVファイル(改行区切り)のレコード数を取得するにはどうすればいいですか? 2.CSVファイル(改行区切り)の最初のレコードのみ削除するにはどうすればいいですか?   また、レコードを指定して削除することはできますか? 3.CSVファイル(改行区切り)のレコードを指定して内容を変更することはできますか? Windows XP , VB6

質問者が選んだベストアンサー

  • ベストアンサー
  • flowergoo
  • ベストアンサー率38% (13/34)
回答No.1

VBでCSVファイルを処理する場合、TextStreamオブジェクトを取得してから諸々のメソッドを使用します。 1について 行数を取得するメソッドは心当たりが無いので、SkipLineメソッドとAtEndOfLineプロパティを組み合わせてループを組んでみてはいかがでしょうか。 2・3について 行を削除するメソッドは無いので、ReadLineメソッドとWriteLineメソッドを使用して行うのですが、特定の行のみを削除する場合は、削除する行以外の行を読み込んでから再び書き込みます。 レコードを指定して内容を変更する場合は、SkipLineメソッドで行を移動してからReadLineメソッドとWriteLineメソッドを使用してみてはいかがでしょうか。 その他、 OpenAsTextStreamのモードはForWritingにして下さい。

その他の回答 (5)

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.6

> VBでCSVを操作しているのですが... いろいろ方法はありますけど、、今はどうやってのですか? > CSVファイル(改行区切り) この意味が良くわからないですけど、一般的な CSV ファイルの仕様だとして、 既出の方法以外では、ADODB.Recordset を使うとか。 試すなら、Microsoft ActiveX Data Objects x.x の参照設定が必要です。 レイトバインドでも大丈夫ですけど。 サンプルは件数表示だけですけど、更新や追加や削除なども応用です。   Dim RS   As ADODB.Recordset   Dim strSQL As String   Const CON_STRING = "Driver={Microsoft Text Driver (*.txt; *.csv)};DBQ="   ' FROM 句に CSV ファイル名を使う   strSQL = "SELECT COUNT(*) AS Kensu FROM Sample.csv;"      Set RS = CreateObject("ADODB.Recordset")   RS.Open strSQL, CON_STRING & App.Path & ";", adOpenForwardOnly   Debug.Print RS![Kensu]   RS.Close   Set RS = Nothing

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.5

CSVは シーケンシャルファイルです。 ということは、Index(索引)などのレコード・アクセス用の構造が無いので、初めから順に読んで調べていくよりほかありません。 1は最後まで読まないとレコード数はわかりません。 1度読んだときにレコード数を先頭にでも記録しておかないと。 2.最初のレコードのみは削除できますか という問いがあいまい。削除したものを別にアウトプトファイルで 作ることになり、最後までインプットフィレを読む必要があります 最初を捨てて、インプットファイルを第2から全て1レコードづつをよみ、全てアウトプットファイルに1つづつ書き出します。 ただし、その下ではバッファなどの処理があり、見せ掛け(考え方)と実際のIOシステムのやっていることは差があります。 3は部分的書き換えが可能な記録媒体で、物理的IOを駆使すればできますが、以前より変更後の情報が長いと、越える部分は物理的に入れようがありません。 しかしファイル構造を自分流に構成すれば、以上の反例はいくらでも作れます。 CSVファイル以外では、ある特定のファイルアクセスメソッドがどうなっているかを勉強すべきことになりますが、少なくともCSVファイルはレコードアクセスのための、特別の仕掛けをもって無いものです。 この質問は多分個人のコーディングの多様性とは関係ないものです。 ファイル構造の解説書やIBMから始まる大型コンピュターのファイルシステムを経て、パソコンの時代になって、メモリはふんだんに使え 、処理スピードは上がり、外部記憶もふんだんに使えるようになったため、昔に苦労されたことが、問題として意識されなくなっているようです。 例えばかなりのレコード数でも全部メモリに読み込む方法を採るなら、1.2.3も可能に見せることもできそう。 そのほかに、ついでに、レコードの項目の区別は、概観すると (1)定位置(どの位置からどの位置までどういう情報を置くか)約束する。固定長的。 (2)セパレータ(カンマ)などを使い、順番で内容を約束する。 (3)標題をつける(HTMLやXML) の組み合わせzしかありません。VBの引数の指定などで(2)、(3)の類似の考えはは出てきます。

noname#22222
noname#22222
回答No.4

ご承知のようにプログラミング要領は各人各様です。 私は、直ぐに、FileSystemObject の使い方を忘れるので次のような関数を使っています。 FileReadArray()----ファイルを行単位で配列変数に呼び込む! FileRead()---------1行1行読み込む! FileWrite()--------ファイルを書き込む! もしかしたら、これらの関数を利用すれば質問者の意図が簡単に実現できるかも知れません。 ------------------------------------------------------------------------------ RowDatas() = FileReadArray("FileName") で、RowDatas() に各行を読み込みます。 ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ Datas="0" Do Until Datas <> ""   Datas = FileRead("FileName")   IF Len(Datas) > 0 Then     一行づつ処理   End If Loop FileRead() は、最初は1行目、次は2行目を戻します。 中途終了する場合は、   Datas = FileRead("FileName", True) ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ FileWrite関数は、これらの配列を Join関数等で結合した後に FileWrite "FileName", AllDatas という感じで使います。 ------------------------------------------------------------------------------ Public Function FileReadArray(ByVal FileName As String) As String() On Error GoTo Err_FileReadArray    Dim fso    As FileSystemObject    Dim fil    As File    Dim txs    As TextStream    Dim strText  As String    Dim strTexts() As String       Set fso = New FileSystemObject    Set fil = fso.GetFile(FileName)    Set txs = fil.OpenAsTextStream(ForReading, TristateUseDefault)    strText = txs.ReadAll    strTexts = Split(strText, Chr$(13) & Chr$(10)) Exit_FileReadArray:    FileReadArray = strTexts()    Exit Function Err_FileReadArray:    MsgBox Err.Description & "(FileReadArray)", vbExclamation, " 関数エラーメッセージ"    strTexts() = Split("")    Resume Exit_FileReadArray End Function Public Function FileRead(ByVal FileName As String, Optional isStop As Boolean = False) As String On Error GoTo Err_FileRead   Static isOpen As Boolean   Static fso  As FileSystemObject   Static fil  As File   Static txs  As TextStream      If Not isOpen Then     isOpen = True     Set fso = New FileSystemObject     Set fil = fso.GetFile(FileName)     Set txs = fil.OpenAsTextStream(ForReading, TristateUseDefault)   End If   FileRead = IIf(fil.Name = FileName, txs.ReadLine, "") Exit_FileRead:   If Len(FileRead) = 0 Or isStop Then     isOpen = False     Set txs = Nothing     Set fil = Nothing     Set fso = Nothing   End If   Exit Function Err_FileRead:   Resume Exit_FileRead End Function Public Function FileWrite(ByVal FileName As String, _              ByVal Text As String) As Boolean On Error GoTo Err_FileWrite   Dim fso As FileSystemObject   Dim txs As TextStream      Set fso = New FileSystemObject   Set txs = fso.CreateTextFile(FileName, True)   txs.Write Text   FileWrite = True Exit_FileWrite:   Exit Function Err_FileWrite:   MsgBox Err.Description & "(FileWrite)", vbExclamation, " 関数エラーメッセージ"   Resume Exit_FileWrite End Function

  • m2m10
  • ベストアンサー率0% (0/11)
回答No.3

CSVファイルを固定長で同でしょう。 1.CSVファイルは全体のおおきさをレコードの長さで   割るか、SQL でカウントをします。 2.最初のレコードのみ削除はできませんが、  ブランクを入れ、削除レコードでは。 3.内容の変更は可能です、ファイルのポインター  Excelで言えば行ですが、その行の数字でGET、  PUT が出来ます。

  • o_chi_chi
  • ベストアンサー率45% (131/287)
回答No.2

1の行数のみの取得であればFileSystemObjectで可能です。 ですが2や3の処理を行うのであれば結局flowergooさんが 回答されているような処理になると思います。

参考URL:
http://www.bcap.co.jp/hanafusa/index.html

関連するQ&A