大変お世話になっております。初心者なもので教えていただきたいのですが、
下記のようなテキストファイル内の、任意箇所のデータを読み書きするには
どのようにすれば良いでしょうか?
テキストファイル名:A.txt
あいうえお,1,234
かきく,23,4567
さしすせ,345,67890
上記ファイルの2行目、2列目を読み出したい。または書き込みたい。
読み出し「23」→書き込み「456」
テキストファイルなので、通常のInputのInput、Writeコマンドを
使って、
Dim A(3)
Dim B(3)
Dim C(3)
と配列を作って、EOFまで「全て」読み込ませ、その中の「B(2)」として
取り出してましたが、もっと膨大なデータとなった場合、「全て」読み出し
しては、メモリー?的に大きくなるため、避けれる(直接指定できる)方法が
あれば、ご教授願いたいと思います。
テキストデータは、各行任意(異なる)バイト数の条件でお願いします。
尚、PC環境は、Windows2000Pro、VB6です。
よろしくお願いします。
直接・・・出来ますかね?
僕なら・・・ファイルを複製して、書き換えて、名前を戻してやろうかな・・・。
行数を見ていけば、データ横流し、っていう処理しか、思いつきません。ごめんなさい。
即興で思いつくのは以下の処理です。
①ファイル複製Bを作る
②元ファイルAを読み込む
③行数が合致したら、配列変換して、希望する列に値を埋める
④文字列に戻す
⑤(③で合致しなくても)複製Bに書き込む
⑥元ファイルAを消して、複製の名前をAに変える
・・・って書いたけど、結構手間かかったりするかしら・・・?
あ、ごめんなさい。日本語おかしいですね。
行番号(何行目か)を見て、希望する行と呼んだ行番号が合致しなければ、読んだ行をそのまま書き込む、って事です。
この問題はシーケンシャルアクセスしかできないレコードの、
n番目の場所を知りたい、という問題なので、
ファイル構造を変える事をオススメするぞw
以下の構造をファイルに含ませれば、まー何とかなるかもしれない。
・固定長レコードにする
または
・n番目のレコードへのファイルシーク番号を保持する。
※誤爆かも知らん。
ガッ氏は、たまにまともなことを言う。
答えじゃなくて申し訳ないんだけど
>膨大なデータとなった場合
ちなみにデーターの大きさはどの位なんですか?
>ぬるぽ
(TдT) アリガトウ
メモリの事だけでいいなら
バイナリで作業すれば可能だと思う。
改行コード数えてシークでゲット
始めまして、UMEBAINDといいます。
VBAは初心者なもので教えていただきたいのですが、
以下のようなプログラムを作りSEEK関数を利用して
ファイルから検索している文字が見つかれば
新たに検索する文字を入れ替え
見つかった行のその次の行から検索し処理を
短時間で終了させるような事をやりたいのですが
<<<このPGの本体とも言うべきプログラムは約25万件の処理を
行う為>>>
どうかご教授ください。
よろしくお願いします。
Sub FSEEK()
'MsgBox "引数=" & Mails
Dim s As String
Dim MyArray
Dim d
s = CurDir 'カレントフォルダを取得する
MyArray = Split(s, "\", -1) 'カレントフォルダを"¥"で分割する
'カレントフォルダを再構成する
s = MyArray(0) & "\" & MyArray(1) & "\" & MyArray(2) & "\" & "デスクトップ\ファイルシーク"
ChDir s 'カレントフォルダを変更する
Dim strFILENAME2 As String
strFILENAME2 = s & "\FILESEEK2.txt"
Dim strREC 'オーバーフローの為
Dim setlist As Variant 'SPLITの戻り値はバリアント型の為
Dim n, comt, counter
'strFILENAME2 = s & "\FILESEEK2.txt"
Dim intFileno As Integer
Dim i
Dim jjj As Variant
Dim uuu As Long
Dim dse, A1, A2 As String
Open strFILENAME2 For Input As #1
Dim strtest
Dim ddd As String
Dim FPos As Long
counter = 0
i = 1
Do Until EOF(1)
Line Input #1, strREC
jjj = Split(strREC, ",")
dse = jjj(1)
A1 = "6columsyori"
A2 = "12columsyori"
If StrComp(dse, A1) = 0 Then
MsgBox i & "行目" & "で見つかりました!" & A1 & "行目の処理:" & Loc(1)
FPos = Seek(1)
MsgBox FPos & "⇔本当の現在位置"
A1 = ""
A1 = A2 '処理の入れ替え
Seek #1, FPos + 1 '見つかった位置から検索する
End If
i = i + 1
Loop
'
Close #intFileno
End Sub
データは以下のファイルです。・**************************************
\FILESEEK2.txt
1FILESEEKTESTNOW,1columsyori
2FILESEEKTESTNOW,2columsyori
3FILESEEKTESTNOW,3columsyori
4FILESEEKTESTNOW,4columsyori
5FILESEEKTESTNOW,5columsyori
6FILESEEKTESTNOW,6columsyori
5FILESEEKTESTNOW,7columsyori
5FILESEEKTESTNOW,8columsyori
9FILESEEKTESTNOW,9columsyori
10FILESEEKTESTNOW ,10columsyori
11FILESEEKTESTNOWSEEEK ,11columsyori
12FILESEEKTESTNOW ,12columsyori
13FILESEEKTESTNOWSEEEK,13columsyori
14FILESEEKTESTNOW ,14columsyori
15FILESEEKTESTNOW ,15columsyori
16******************** ,16columsyori
17 uu ,17columsyori
18 uuuu ,18columsyori
19FILESEEKTESTNOW,19columsyori
20FILESEEKTESTNOW,20columsyori
21FILESEEKTESTNOW,21columsyori
22FILESEEKTESTNOW,22columsyori
23 g ,23columsyori
24 g ,24columsyori
25 g ,25columsyori
26 g ,26columsyori
27 g ,27columsyori
28 g ,28columsyori
29 g ,29columsyori
30 g ,30columsyori
別スレ始めてるならその旨も書いとけや…
影殿,ガッ殿,ぬるぽ殿,ねろ殿,通りすがり殿
皆様、早速のご意見ありがとうございました。
やはり異なったデータ数では、一度に読み込む方法しか
ないといったところでしょうか。
バイナリ、シーク、データ長固定の方法以外
(データ数の異なる条件)で、何か良い方法があればと
思ったもので。
「何行目」の「何列目」とダイレクトな指定方法が…。
データ数も膨大と書きましたが、どの程度とはまだ未定です。
いろいろご意見ありがとうございました。
また何か良い方法があれば教えて下さい。
umebaind殿>新スレをお願いします。
新スレ立てたら、仮に[解決]チェックして頂けると幸いです。
よって、しばらく未解決にしときます。
皆様どうもありがとうございました!
ありがとうございました、マルチポストに対してはそれだけ「必死」
ということで勘弁してください
ファイルシークで処理することなくVBAの辞書機能を
使用することにより22時間かかる処理が60分まで短縮しました
Set xlApp2 = CreateObject("Scripting.Dictionary")
ツイート | ![]() |