プロが教える店舗&オフィスのセキュリティ対策術

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

Windows XP , VB6

A 回答 (6件)

VBでCSVファイルを処理する場合、TextStreamオブジェクトを取得してから諸々のメソッドを使用します。


1について
行数を取得するメソッドは心当たりが無いので、SkipLineメソッドとAtEndOfLineプロパティを組み合わせてループを組んでみてはいかがでしょうか。
2・3について
行を削除するメソッドは無いので、ReadLineメソッドとWriteLineメソッドを使用して行うのですが、特定の行のみを削除する場合は、削除する行以外の行を読み込んでから再び書き込みます。
レコードを指定して内容を変更する場合は、SkipLineメソッドで行を移動してからReadLineメソッドとWriteLineメソッドを使用してみてはいかがでしょうか。

その他、
OpenAsTextStreamのモードはForWritingにして下さい。
    • good
    • 0

1の行数のみの取得であればFileSystemObjectで可能です。


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

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

CSVファイルを固定長で同でしょう。



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

ご承知のようにプログラミング要領は各人各様です。


私は、直ぐに、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
    • good
    • 0

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)の類似の考えはは出てきます。
    • good
    • 0

> 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
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!