- ベストアンサー
CSVファイル操作
VBでCSVを操作しているのですが、わからないことがあるので教えてください。 1.CSVファイル(改行区切り)のレコード数を取得するにはどうすればいいですか? 2.CSVファイル(改行区切り)の最初のレコードのみ削除するにはどうすればいいですか? また、レコードを指定して削除することはできますか? 3.CSVファイル(改行区切り)のレコードを指定して内容を変更することはできますか? Windows XP , VB6
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
VBでCSVファイルを処理する場合、TextStreamオブジェクトを取得してから諸々のメソッドを使用します。 1について 行数を取得するメソッドは心当たりが無いので、SkipLineメソッドとAtEndOfLineプロパティを組み合わせてループを組んでみてはいかがでしょうか。 2・3について 行を削除するメソッドは無いので、ReadLineメソッドとWriteLineメソッドを使用して行うのですが、特定の行のみを削除する場合は、削除する行以外の行を読み込んでから再び書き込みます。 レコードを指定して内容を変更する場合は、SkipLineメソッドで行を移動してからReadLineメソッドとWriteLineメソッドを使用してみてはいかがでしょうか。 その他、 OpenAsTextStreamのモードはForWritingにして下さい。
その他の回答 (5)
- KenKen_SP
- ベストアンサー率62% (785/1258)
> 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)
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)の類似の考えはは出てきます。
ご承知のようにプログラミング要領は各人各様です。 私は、直ぐに、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)
CSVファイルを固定長で同でしょう。 1.CSVファイルは全体のおおきさをレコードの長さで 割るか、SQL でカウントをします。 2.最初のレコードのみ削除はできませんが、 ブランクを入れ、削除レコードでは。 3.内容の変更は可能です、ファイルのポインター Excelで言えば行ですが、その行の数字でGET、 PUT が出来ます。
- o_chi_chi
- ベストアンサー率45% (131/287)
1の行数のみの取得であればFileSystemObjectで可能です。 ですが2や3の処理を行うのであれば結局flowergooさんが 回答されているような処理になると思います。