Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
Find and Replace in huge text file
Message
From
28/09/2005 14:22:07
 
General information
Forum:
Visual FoxPro
Category:
Other
Miscellaneous
Thread ID:
01053411
Message ID:
01054099
Views:
47
Yes, you are right but I need to do 2 other changes to the code
1 - Reduce No. at MAXBUFFER variable to 65530 or so
2 - Remove MAXBUFFER from FWRITE statement below.


>If the replaced text is different in size than the find text, do you think it will work fine.
>Ex. Find String = "AD00" & Replace String = "RR889"
>
>>>Try this (modified from Cetin code) for testing if the replaced string is being split during FREADs:
>>>
>>>
>>>#DEFINE MAXBUFFER 65536
>>>lhIn = FOPEN(lcFileIn)
>>>lhOut = FCREATE(lcFileOut)
>>>DO WHILE NOT FEOF(m.lhIn )
>>> lcBuffer = FREAD(m.lhIn, MAXBUFFER)
>>> DO CASE
>>> CASE RIGHT(lcBuffer,3) = 'AD0'
>>> FSEEK(m.lhIn, -3, 1)
>>> lcBuffer = LEFT(lcBuffer,LEN(lcBuffer)-3)
>>> CASE RIGHT(lcBuffer,2) = 'AD'
>>> FSEEK(m.lhIn, -2, 1)
>>> lcBuffer = LEFT(lcBuffer,LEN(lcBuffer)-2)
>>> CASE RIGHT(lcBuffer,1) = 'A'
>>> FSEEK(m.lhIn, -1, 1)
>>> lcBuffer = LEFT(lcBuffer,LEN(lcBuffer)-1)
>>> ENDCASE
>>> FWRITE(m.lhOut,STRTRAN(lcBuffer,'AD00','BR77'),MAXBUFFER)
>>>ENDDO
>>>FCLOSE(m.lhIn)
>>>FCLOSE(m.lhOut)
>>
>>I didn't understand what Fabio meant either. Your code is nicer and faster than mine:) It processed a 138+Mb file in 14 secs on my box (Athlon 2500+,512Mb onboard 64Mbshared mem VGA).
>>Cetin
>
>I don't see where the size of the replace string would be of concern -- the FREAD pointer would not change for >the input file since it is solely dependent on the string to be found (adjustments if possible matches at end >of FREAD string). The replaced string would be in the output file and does not affect the pointer to the file >position in the input file.

Yes, you are correct in the FWRITE -- use LEN(lcBuffer) instead; my oversight.
Previous
Reply
Map
View

Click here to load this message in the networking platform