No.1ベストアンサー
- 回答日時:
VBでCSVファイルを処理する場合、TextStreamオブジェクトを取得してから諸々のメソッドを使用します。
1について
行数を取得するメソッドは心当たりが無いので、SkipLineメソッドとAtEndOfLineプロパティを組み合わせてループを組んでみてはいかがでしょうか。
2・3について
行を削除するメソッドは無いので、ReadLineメソッドとWriteLineメソッドを使用して行うのですが、特定の行のみを削除する場合は、削除する行以外の行を読み込んでから再び書き込みます。
レコードを指定して内容を変更する場合は、SkipLineメソッドで行を移動してからReadLineメソッドとWriteLineメソッドを使用してみてはいかがでしょうか。
その他、
OpenAsTextStreamのモードはForWritingにして下さい。
No.2
- 回答日時:
1の行数のみの取得であればFileSystemObjectで可能です。
ですが2や3の処理を行うのであれば結局flowergooさんが
回答されているような処理になると思います。
参考URL:http://www.bcap.co.jp/hanafusa/index.html
No.3
- 回答日時:
CSVファイルを固定長で同でしょう。
1.CSVファイルは全体のおおきさをレコードの長さで
割るか、SQL でカウントをします。
2.最初のレコードのみ削除はできませんが、
ブランクを入れ、削除レコードでは。
3.内容の変更は可能です、ファイルのポインター
Excelで言えば行ですが、その行の数字でGET、
PUT が出来ます。
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
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)の類似の考えはは出てきます。
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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) データ解析ソフトRでのファイル入力read.csvがエラーになります 7 2022/03/27 22:11
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Visual Basic(VBA) VBA初心者です。電話番号の数字の前に0を表示させたいです。 2 2022/12/14 03:58
- Visual Basic(VBA) VBAで特定の場所にあるCSVファイル(複数)から特定場所を抜き出してExcelに転記したいです。 11 2023/05/23 16:29
- Outlook(アウトルック) 【 Windows 10 】アドレス帳に正しくインポートを完了させたい。 3 2023/04/23 13:41
- Access(アクセス) access,vbaでフォルダ内のファイルをテーブルにインポート、ファイル名もフィールドに追加したい 1 2022/08/31 11:11
- システム メールのcsv添付ファイルの種類を テキスト形式からカンマ区切り形式に 変更する方法はありますか? 4 2023/03/09 20:33
- Excel(エクセル) Excel VBAでフォルダが何層にもなっていて最下層の中にCSVファイルがあり最上層のファイルを指 4 2022/06/08 20:41
- Excel(エクセル) エクセル テーブル機能の不明点 2 2022/04/14 14:10
- Excel(エクセル) 【マクロ】webアドレスにて指定されたCSVファイル【excelソフト表示】を印刷する件 1 2023/02/15 01:52
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッチによるショートカットの...
-
HTMLプログラムにExcelをリンク...
-
ファイルのアクセス権の取得
-
VBAを使い、Web上からファイル...
-
エクセルVBAについて
-
HTMLタグのあるCSVファイルを利...
-
ボタンをファイルにリンクさせたい
-
fopenでNULLを返されるがGetLas...
-
動的に生成したVSBファイルへデ...
-
エクセルVBA ファイルOPEN時の...
-
1フォルダに保存できるファイル...
-
Java.io.FileクラスのsetLastMo...
-
Excel VBAどこが間違ってますか?
-
subversionからファイル取得時...
-
JSONファイルをダウンロードさ...
-
VBAでファイルパスが長すぎてコ...
-
複数のテキストファイルをexcel...
-
Excelでdatファイルを作成??
-
OpenTextFile で書き込みできま...
-
フォルダ作成用バッチファイル...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッチによるショートカットの...
-
1フォルダに保存できるファイル...
-
VBAを使い、Web上からファイル...
-
ファイルのアクセス権の取得
-
Excel VBAどこが間違ってますか?
-
エクセルVBA ファイルOPEN時の...
-
Excel-VBA 撮影日時の取得
-
Windowsのメモ帳でジョークウイ...
-
ボタンをファイルにリンクさせたい
-
JSONファイルをダウンロードさ...
-
subversionからファイル取得時...
-
iniファイルのセクションについて
-
VBAでファイルを指定して印刷さ...
-
fopenでNULLを返されるがGetLas...
-
WebLogic/javaで一部JSPだけが...
-
FTPサーバからファイルをダウン...
-
エクセルをダウンロードさせる...
-
Java.io.FileクラスのsetLastMo...
-
IEで複数のファイル選択方法
-
VC++2003SDIでMFCアプリ作成中...
おすすめ情報