テキストファイル内の任意箇所読み出し、書き込みをするには?

解決


じんくん  2005-02-02 23:55:53  No: 119384

大変お世話になっております。初心者なもので教えていただきたいのですが、
下記のようなテキストファイル内の、任意箇所のデータを読み書きするには
どのようにすれば良いでしょうか?

テキストファイル名: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です。

よろしくお願いします。


  2005-02-03 00:51:27  No: 119385

直接・・・出来ますかね?
僕なら・・・ファイルを複製して、書き換えて、名前を戻してやろうかな・・・。
行数を見ていけば、データ横流し、っていう処理しか、思いつきません。ごめんなさい。

即興で思いつくのは以下の処理です。
①ファイル複製Bを作る
②元ファイルAを読み込む
③行数が合致したら、配列変換して、希望する列に値を埋める
④文字列に戻す
⑤(③で合致しなくても)複製Bに書き込む
⑥元ファイルAを消して、複製の名前をAに変える

・・・って書いたけど、結構手間かかったりするかしら・・・?


  2005-02-03 01:05:36  No: 119386

あ、ごめんなさい。日本語おかしいですね。
行番号(何行目か)を見て、希望する行と呼んだ行番号が合致しなければ、読んだ行をそのまま書き込む、って事です。


ガッ  2005-02-03 01:30:16  No: 119387

この問題はシーケンシャルアクセスしかできないレコードの、
n番目の場所を知りたい、という問題なので、
ファイル構造を変える事をオススメするぞw
以下の構造をファイルに含ませれば、まー何とかなるかもしれない。
・固定長レコードにする
または
・n番目のレコードへのファイルシーク番号を保持する。

※誤爆かも知らん。


ぬるぽ  2005-02-03 01:42:46  No: 119388

ガッ氏は、たまにまともなことを言う。


ねろ  2005-02-03 02:05:43  No: 119389

答えじゃなくて申し訳ないんだけど
>膨大なデータとなった場合
ちなみにデーターの大きさはどの位なんですか?


ガッ  2005-02-03 04:07:30  No: 119390

>ぬるぽ
(TдT) アリガトウ


通りすがり  2005-02-03 04:17:04  No: 119391

メモリの事だけでいいなら
バイナリで作業すれば可能だと思う。
改行コード数えてシークでゲット


umebaind  2005-02-03 05:08:06  No: 119392

始めまして、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


ガッ  2005-02-03 05:47:39  No: 119393

別スレ始めてるならその旨も書いとけや…


じんくん  2005-02-03 19:02:01  No: 119394

影殿,ガッ殿,ぬるぽ殿,ねろ殿,通りすがり殿

皆様、早速のご意見ありがとうございました。

やはり異なったデータ数では、一度に読み込む方法しか
ないといったところでしょうか。
バイナリ、シーク、データ長固定の方法以外
(データ数の異なる条件)で、何か良い方法があればと
思ったもので。
「何行目」の「何列目」とダイレクトな指定方法が…。
データ数も膨大と書きましたが、どの程度とはまだ未定です。

いろいろご意見ありがとうございました。
また何か良い方法があれば教えて下さい。

umebaind殿>新スレをお願いします。
新スレ立てたら、仮に[解決]チェックして頂けると幸いです。

よって、しばらく未解決にしときます。

皆様どうもありがとうございました!


UMEBAIND  2005-03-16 19:39:11  No: 119395

ありがとうございました、マルチポストに対してはそれだけ「必死」
ということで勘弁してください
ファイルシークで処理することなくVBAの辞書機能を
使用することにより22時間かかる処理が60分まで短縮しました
Set xlApp2 = CreateObject("Scripting.Dictionary")


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加