- ベストアンサー
CSVファイル操作
VBでCSVを操作しているのですが、わからないことがあるので教えてください。 1.CSVファイル(改行区切り)のレコード数を取得するにはどうすればいいですか? 2.CSVファイル(改行区切り)の最初のレコードのみ削除するにはどうすればいいですか? また、レコードを指定して削除することはできますか? 3.CSVファイル(改行区切り)のレコードを指定して内容を変更することはできますか? Windows XP , VB6
- freednia
- お礼率54% (105/192)
- Visual Basic
- 回答数6
- ありがとう数1
- みんなの回答 (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/17068)
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さんが 回答されているような処理になると思います。
関連するQ&A
- CSVファイルを読んでシートに書き込む方法
エクセルのマクロ(VB6.5)でCSVファイルをよんでシートに書き込みたいのですが誰か教えて下さい。 例えば CSVファイルはこんな感じだとします。 ファイルID:test.csv ファイル内容 (1レコード)123,123,123,123,123,123 (2レコード)456,456,456,456,456 (3レコード)789,789,789,789 書き込むシートは「abcシート」とします。 CSVファイルはカンマ区切りですがレコード毎にカンマ区切りのデータ数が違います。 シートには指定したセルに書き込めば一番いいのですが、上から順番に書き込んでもいいです。 申し訳ありませんが、宜しくお願い致します。
- ベストアンサー
- Visual Basic
- VB6.0 CSVファイル読み込みについて
VB6.0について質問です。 CSVファイルの読み込みを行いたいのですがうまくいきません。。。 以下のソースのどこに問題ありますでしょうか?>< 14個のカンマ区切りのCSVファイルを読み込んでいますが ファイルのデータを変更するとインデックスが有効範囲にありませんというエーラーがでます。。。 ファイルは3行で構成しているのですがヘルプを参照したら複数行の場合はLINE Input #1, MyString(i)と書いてありました。 しかしやってみると行ごとのデータを取得してカンマ区切りで取得してくれませんでした。。。 以下のソースで実行すると改行部でエラーになるようです。 改行を無視するようなロジックを入れる必要があるのでしょうか? Dim MyString(), i Open App.path & "\" & CSV_filename For Input As #1 ReDim MyString(13) Do While Not eof(1) Input #1, MyString(i) Label4(i).caption = MyString(i) i = i + 1 Loop Close #1
- ベストアンサー
- Visual Basic
- csvデータをレコード毎に改行させたい
タブ区切りのcsvファイルを書き出したのですが、レコード毎に改行されずに1行の長いデータになってしまいました。 この書き出し方法そのものを変更することはできません。 (iTunes8.1での「プレイリスト書き出し」です) これを27項目ごとに改行させて、Excelなどの表計算ソフトで1行が1レコードとなるようにデータを加工したいのですが、どうすればいいのでしょうか? Macユーザーなので、できればOpenOfficeなどでできる方法で教えていただけると助かります。
- ベストアンサー
- その他(データベース)
- 改行のあるCSVファイルをExcelに読み込みたい
CSVファイルをExcelにインポートしたいのですが CSVファイルのデータ内に改行が入っていたので、レイアウトが崩れて、 うまくExcelにインポートできない状態です。 改行を置き換えで取り除くと、すべて横並びになってしまいます。 1レコードは59項目と決まっているのですが、手作業で改行を入れるのは 数が多く難しそうです。 なんとかうまく取り込む方法はないでしょうか? プログラミングは全くわかっていない初心者ですが、 エクセルのVBAにコピペして実行することは可能です。。。 カテ違いだったらすみません><
- ベストアンサー
- Excel(エクセル)
- CSVファイル読み込みでズレがおきる
お世話になります。 Windows XP SP3、Access2003 で CSVファイルをインポートする処理をつくっています。 読み込むCSVファイルが大きく、必要ないフィールドが多いのですが、 下記のようにLine Input で全部読み込んで Splitでカンマ区切りでバラしてvarData(Variant型)にいれて レコードセット(インポート先の既存テーブル)に入れる時に、 必要に応じてデータ型を変更して フィールド指定ししていれるようにしています。 ところが、CSVファイルの中のデータで数件ほど ちゃんと読み込めないものがあり、 レコードセットにいれるときにエラーでとまってしまいます。 調べてみると、フィールドで取得した値がずれており、 前の方の複数のフィールドでNull値があった場合?に ずれ込むことがあるようです。 どうしたらこの現象はなおせるのか教えてください。 それとも・・・ このようにフィールド指定してレコードセットに入れ込むよりも 一度CSVファイルの全レコードを他のテーブルにインポートして、 そこからインポート先の既存の本テーブルにいれたほうがいいのでしょうか? よろしくお願いいたします。 Open ---- For Input As---- Line Input #lngFileNum, strData インポート先のテーブルをレコードセットで開く DAO、トランザクション使用 Do Until EOF(lngFileNum) Line Input #lngFileNum, strData 'データを配列へ varData = Split(strData, ",") With rs .AddNew !番号 = CLng(varData(0)) !名称 = varData(1) !受付日 = DateValue(varData(8)) !種別 = varData(10), "" !登録番号 = CLng(varData(11)) (以下略)
- 締切済み
- その他(データベース)
- ExcelのCSVファイル出力について
Excelが出力したCSVファイルを扱うプログラムに関する質問です。 Windwosの[コントロールパネル]⇒[地域と言語のオプション]で、 小数点の記号を「.(ピリオド)」から「,(カンマ)」に変更しました。 するとExcelからCSVファイルを出力したときの各データの区切り文字が 「,(カンマ)」から「;(セミコロン)」に変わるようなのですが、 これに対応できるプログラムを作りたいと考えています。 CSVファイルの区切り文字は、Windowsのロケール情報として プログラム上から取得可能なのでしょうか?
- ベストアンサー
- Visual Basic
- CSVファイルが操作できるソフト
いつもお世話になっています CSVファイルの特定の項目について、文字を加えたいのですが、件数が膨大 なため(15万レコード程度)、エクセルで操作することができません。 文字を加えるというのはこのようなイメージです 012011,012225,125666,54855~ ↓ 012011,K012225,125666,54855~ 分割してエクセルによみこまして処理することも考えたのですが、大変手間でも ありますので、このような機能があるようなCSVファイル操作できるフリーソフト はありませんでしょうか?
- ベストアンサー
- フリーウェア・フリーソフト
- CSVファイルの中身を操作したいけど何の言語がいいのでしょうか
驚くべきCSVファイルがあります。100MBとか。たぶん、行が何十万行となるんでしょう。エクセルでは開ききれず6万5千行くらいまで開かれて残りは見れませんでした。 このCSVファイルを操作したいのです。CSVファイルはコンマ区切りのファイルですが、例えば 1,1,3 2,2,1 1,1,2 1,2,1 こんな内容だったとして、二番目の数字が2の場合の行のみをコピーして別の新しいCSVファイルが作りたいのです。 こういう操作はどんな言語で可能なのでしょうか。簡単に書けるのでしょうか。 私が持っているもので使える環境があるのは、C言語、MicrosoftのVisual BasicとVisual C++? です。Javaもあったような。 あと、気になってるのはMatlabです。
- ベストアンサー
- その他(プログラミング・開発)
- 文字として, "を使用するCSVファイルの取り扱い
題名の通り、文字として,(カンマ)、"(ダブルクォート)を使用するCSVファイルの取り扱いについて教えて頂きたいです。 読み込むCSVファイルの形式は以下の通りです。 ・項目の最初と最後には"が設定される ・項目内の,は文字として扱う 例:"5,000" 5の後の,は項目内に設定されている為、文字として扱う ・項目内に"を設定する場合は""と設定する ・レコードは改行コード単位 例:"A","5,000","B","C""D""" 1項目目:"A" 2項目目:"5,000" 3項目目:"B" 4項目目:"C""D""" 上記の様なCSVファイルを読み込み、項目を取得するにはC言語ではどの様に対応するべきでしょうか。 下記方法で対応出来そうですが、効率が非常に悪いと思われます。 (1)fgetsにて1行分のレコードを読み込む。 (2)取得したレコードに対して、カンマを指定してstrtokを実行し、,間の値を取得する。 (3)取得したカンマ間の項目のダブルクォートの数をカウントする。 (4)-1カウント数が偶数の場合 ,を区切り文字とし、取得した値を1項目として扱う。 (4)-2カウント数が奇数の場合 ,を文字とし、次のカンマ間の項目を取得し、連結する。 連結した値のダブルクォート数をカウントし、カウント数が奇数か偶数か判定する。 (5)上記処理をstrtok結果がNULLになるまで繰り返し、NULLが帰ってきたら次の行のレコードを読み込む。 (6)上記処理をEOFまで繰り返す。 以上、よろしくお願いします。
- ベストアンサー
- C・C++・C#
- csvファイルの作成日時
os:windows2000pro tool:vb6.0sp5 csvファイル:カンマ区切 (1)csvファイルの作成日時の取得方法 test.csvのプロパティを確認すると 1.作成日時 2.更新日時 3.アクセス日時 と項目があります。 この作成日時を取得する方法を教えてください (2)また、csvファイル内部 日時,総合,国語,算数,理科,社会 2005/03/29 11:29:28,5,90,98,88,80 2005/03/30 08:23:28,4,98,70,65,80 という情報が続きます。 この2行目の日時を取得する方法を教えてください 以上、よろしくお願いいたします
- ベストアンサー
- Visual Basic