[asp]Read / write grote textfiles.

Pagina: 1
Acties:
  • 31 views sinds 30-01-2008

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 13:55
Helaas moet ik regelmatig een vrij fors excel file (> 70Mb) ombouwen naar een x aantal textfiles (tabgescheiden) van +/- 1000 records per keer.

Nu wilde ik dit een beetje gaan automatiseren. Ik dacht, hee, dat doe ik wel even in asp, zeker ook omdat het op een webserver draait die geen asp.Net ondersteund. (Gekke probs met het framework :( ).
Anyway, ik heb dus een test file van 4 Mb.

Die wil ik inlezen, maar je raadt het al: de hele handel gaat onderuit.

Na het e.e.a. aan zoekwerk kwam ik op een mooi vergelijkend iets uit op 4Guys.

Daar stond het volgende (ongeveer) stukje:
VBScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const ForReading = 1
const TristateFalse = 0
dim strSearchThis
dim objFS
dim objFile
dim objTS
set objFS = Server.CreateObject("Scripting.FileSystemObject")
set objFile = objFS.GetFile("C:\Inetpub\wwwroot\tests\CT3_1.txt")
set objTS = objFile.OpenAsTextStream(ForReading, TristateFalse)

strSearchThis = objTS.Read(objFile.Size)

if instr(strSearchThis, "Egeraat") > 0 then
    Response.Write "Found it!"
end if

Dat werkt supersnel (zoektijd van +/- 2 sec in een file van 4 Mb.)
Nu komt de kicker:
Ik moet dus van dat file wat bestaat uit +/- 10.000 "regels" per 1000 regels een textfile maken.

En ik krijg het maar niet voor elkaar om met bovenstaande code het WriteLine gedeelte er tussen te bedenken. Omdat je imho nog steeds naar het feit moet gaan om alles in te lezen.

Vervolgens een ander voorbeeld geprobeerd:
VBScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const ForReading = 1
dim strSearchThis
redim arrSearchThis(-1)
dim i
dim objFS
dim objTS
set objFS = Server.CreateObject("Scripting.FileSystemObject")
set objTS = objFS.OpenTextFile("C:\Inetpub\wwwroot\tests\CT3_1.txt", ForReading)

i = 0
'=========code tussengevoegd====
'filename = "1_ct3_00001_01001.dbf"
'dim fs,tfile
'set fs=Server.CreateObject("Scripting.FileSystemObject")
'set tfile=fs.CreateTextFile("c:\rob_jobfiles\"&filename)
do until objTS.AtEndOfStream 'and  i = 1001
  redim preserve arrSearchThis(i)
  arrSearchThis(i) = objTS.ReadLine
 ' tfile.WriteLine(arrSearchThis(i))
  i = i + 1
loop

Dan wordt de hele handel alsnog compleet ingelezen en krijg ik een timeout.
De commented code heb ik zelf tussen gevoegd, en dat lever imho een probleem. (regels 11,12,13,14,15, stukej van 16 en regel 19).

Iemand die mij een duw in de goede richting kan geven?

Heart..pumps blood.Has nothing to do with emotion! Bored


  • Dutch_guy
  • Registratie: September 2001
  • Laatst online: 20-04 14:47

Dutch_guy

WYSIWYG

Gewoon je Server.ScriptTimeout verhogen in je code.

Ik importeer hier regelmatig textbestanden van een paar honderd MB, probleemloos.

Pay peanuts get monkeys !


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 13:55
Mjah, dat lijkt me een "laatste" redmiddel.
Ik bedoel, met de eerste optie ben ik in 2 seconden klaar.

Heart..pumps blood.Has nothing to do with emotion! Bored


Verwijderd

Als ik goed begrepen heb dat je van een Excel file naar text files moet, waarom doe je het dan niet gewoon in VBA?

Je hebt daar meteen toegang tot de hele Excel file, geen last van timeouts, en je kan een macro maken (met een knop op de balk, of wat jij wil), die je om de zoveel tijd een keer uit kan voeren.

En als dat nog te veel moeite is, dan kun je een VBScript maken dat de macro aanroept en dat script schedulen.

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 13:55
Komt de volgende kicker:
Het Excel file moet vanwege bepaalde redenen op de Mac geopend worden en gesaved naar txt (tab delimited).

Neem aan dat je geen vba op de mac hebt?

@NMe84: idd, maar ben er achter gekomen dat die code helemaal bagger is, omdat ik het filename niet wijzig, dus ik ben nu een stream van 4 Mb aan het readen, en die ook gewoon weer terug aan het zetten in een ander file :)

VBA is een optie, maar dan moet ik volgens mij het excel file aanpassen, en dat wil ik eigenlijk niet doen.

[ Voor 49% gewijzigd door TeeDee op 05-08-2004 15:52 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 14:53

NMe

Quia Ego Sic Dico.

Op regel 16 moet die and sowieso een or zijn volgens mij. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

TeeDee schreef op 05 augustus 2004 @ 15:46:
Komt de volgende kicker:
Het Excel file moet vanwege bepaalde redenen op de Mac geopend worden en gesaved naar txt (tab delimited).

Neem aan dat je geen vba op de mac hebt?
Durf ik niet te zeggen. Duw eens op Alt-F11?

Ik ben trouwens eigenwijs: waarom moet het persé op een Mac gebeuren? Als het om de compatibiliteit van de resulterende textfiles gaat, dan is het enige struikelblok denk ik de Mac newlines (#13). Die schrijf je dan gewoon op een (Windows) PC... of denk ik nu te makkelijk?

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 13:55
Verwijderd schreef op 05 augustus 2004 @ 15:51:
[...]
Durf ik niet te zeggen. Duw eens op Alt-F11?
Ik ben trouwens eigenwijs: waarom moet het persé op een Mac gebeuren? Als het om de compatibiliteit van de resulterende textfiles gaat, dan is het enige struikelblok denk ik de Mac newlines (#13). Die schrijf je dan gewoon op een (Windows) PC... of denk ik nu te makkelijk?
Excel voor Windows (mijn windows/excel) zet om tekststrings dubbele quotes. Heb me rot gezocht om die eruit te krijgen, maar dat lukt dus niet :)

Ander ideetje schiet me net te binnen, nogmaals eens proberen :)

Heart..pumps blood.Has nothing to do with emotion! Bored


Verwijderd

TeeDee schreef op 05 augustus 2004 @ 15:53:
[...]

Excel voor Windows (mijn windows/excel) zet om tekststrings dubbele quotes. Heb me rot gezocht om die eruit te krijgen, maar dat lukt dus niet :)

Ander ideetje schiet me net te binnen, nogmaals eens proberen :)
Ah, nú zie ik het. Je exporteert het eerst naar een CSV en gaat daarna post-processen om het bruikbaar te maken voor de Mac?

Je kunt ook de CSV "met de hand" maken in VBA, natuurlijk...

Of het post-processen in een vadsoenlijke taal :)

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 13:55
Uhm neen :)

Ik krijg een Excel file van 60K records.
Die moet ik op de Mac splitsen in tabgescheiden text files van +/- 1000 records. Dit moet op de Mac omdat mijn PC de hele format vernaggeld (i.e.: quotes om textstrings, . en , andersom) e.d.

Vervolgens wordt er nog het e.e.a. mee gedaan, alleen dat is niet relevant :)

Heart..pumps blood.Has nothing to do with emotion! Bored


Verwijderd

Ik ben niet thuis in progammeren in asp, dus syntactisch kan het zijn dat de volgende code niet helemaal klopt, maar de logica erachter zou juist moeten zijn

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
dim i,j
dim objFS
dim objTS
set objFS = Server.CreateObject("Scripting.FileSystemObject")
set objTS = objFS.OpenTextFile("C:\Inetpub\wwwroot\tests\CT3_1.txt", ForReading)

i = 0
j = 1

'=========code tussengevoegd====
dim fs,tfile
set fs=Server.CreateObject("Scripting.FileSystemObject")
set tfile=fs.CreateTextFile("c:\rob_jobfiles\part"&j)
do until objTS.AtEndOfStream 
    if i == 1001 then
       j++
       set tfile=fs.CreateTextFile("c:\rob_jobfiles\part"&j)
       i=0 
    end if
    
    tfile.WriteLine(objTS.ReadLine)
    
loop

  • Bud_s
  • Registratie: Maart 2002
  • Laatst online: 23-05 13:46
Moet het vervolgens in een database ???

Kan namelijk ook met VBA
TeeDee schreef op 05 augustus 2004 @ 16:15:
[...]
Vervolgens wordt er nog het e.e.a. mee gedaan, alleen dat is niet relevant :)
TeeDee schreef op 05 augustus 2004 @ 15:46:
Het Excel file moet vanwege bepaalde redenen op de Mac geopend worden en gesaved naar txt (tab delimited).
Als je geholpen wil worden, is het handig dat je het hele verhaal verteld.

Ik heb nu het gevoel dat je delen weglaat, niet omdat wij het niet mogen weten, maar omdat je er niet voor uit wil komen dat je het niet voor elkaar kreeg.

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 13:55
Henjo, tnx voor de tip. Logica klopt aardig :) Tnx.
Maar wat ik nu zie eigenlijk is dat de: AtEndOfStream niet zozeer een "multiplier" loop is. Dus het i = i + 1 gedoe gaat totaal niet op.

En weer terug naar the drawingboard.
Bud_s schreef op 05 augustus 2004 @ 16:21:
Moet het vervolgens in een database ???
Kan namelijk ook met VBA
[...]
[...]

Als je geholpen wil worden, is het handig dat je het hele verhaal verteld.

Ik heb nu het gevoel dat je delen weglaat, niet omdat wij het niet mogen weten, maar omdat je er niet voor uit wil komen dat je het niet voor elkaar kreeg.
Antwoord 1: Nee, het moet niet in een db. Dat zeg ik nergens.
Antwoord 2: Dit is het hele verhaal, tenzij jij het relevant vind dat ik die gegenereerde textfiles in een VIPP parser stop waaruit vervolgens gepersonaliseerde brochures gedrukt worden. Toch?
Antwoord 3: Die bepaalde redenenen geef ik toch? Als ik het op de PC doe, wordt de data vernaggeld!

[ Voor 67% gewijzigd door TeeDee op 05-08-2004 16:25 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 13:55
edit:
crap

[ Voor 98% gewijzigd door TeeDee op 05-08-2004 16:24 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


Verwijderd

Ik weet niet precies hoe je data eruit ziet, maar Excel zet alleen quotes om de gegevens als:

De gegevens een quote bevatten
De gegevens het lijstscheidingsteken bevatten
De gegevens newlines bevatten


Door op je computer het lijstscheidingsteken op TAB te zetten, en dan te exporteren naar CSV (Mac) heb je denk ik toch al een aardige benadering van wat je probeert te bereiken.


edit:
Overigens is het ook wel een beetje brakjes van je importprogramma als hij dat formaat niet goed verwerkt...

[ Voor 15% gewijzigd door Verwijderd op 05-08-2004 16:32 ]


  • Bud_s
  • Registratie: Maart 2002
  • Laatst online: 23-05 13:46
TeeDee schreef op 05 augustus 2004 @ 16:22:
Antwoord 1: Nee, het moet niet in een db. Dat zeg ik nergens.
Antwoord 2: Dit is het hele verhaal, tenzij jij het relevant vind dat ik die gegenereerde textfiles in een VIPP parser stop waaruit vervolgens gepersonaliseerde brochures gedrukt worden. Toch?
Antwoord 3: Die bepaalde redenenen geef ik toch? Als ik het op de PC doe, wordt de data vernaggeld!
Ooit heb ik ergens gelezen dat je Startpost lekker duidelijk mag zijn (wat heb je zoal geprobeerd) klinkt als ???

@Antwoord1 : Klopt, dat is ook het probleem, dat zeg je pas in antwoord 2 (mijn glazen bol is stuk, dus daarom vroeg ik het)
@Antwoord2 : Het gaat niet om mij , volgens mij is voor jouw relevant. Hoe meer info je geeft, hoe makkelijker wij je kunnen helpen
@Antwoord 3 : Misschien een idee ervoor te zorgen dat die data niet vernaggeld word ? Misschien dat wij daarbij kunnen helpen ??


wij = GoTusers

[ Voor 3% gewijzigd door Bud_s op 05-08-2004 16:36 ]


Verwijderd

Maar wat ik nu zie eigenlijk is dat de: AtEndOfStream niet zozeer een "multiplier" loop is. Dus het i = i + 1 gedoe gaat totaal niet op.
Het i = i+1 ontbreekt aan men code en is wel degelijk nodig om te beslissen wanneer je een nieuwe file gaat aanmaken.

Ik weet niet wat je bedoeld met "multiplier loop", maar AtEndOfStream is een test die kijkt of je aan het einde van de file bent. De ReadLine zorgt er in dit geval voor dat er telkens een nieuwe lijn ingelezen wordt en je dus ooit aan het einde van je file komt?

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 13:55
Bud_s schreef op 05 augustus 2004 @ 16:34:
[...]


Ooit heb ik ergens gelezen dat je Startpost lekker duidelijk mag zijn (wat heb je zoal geprobeerd) klinkt als ???

@Antwoord1 : Klopt, dat is ook het probleem, dat zeg je pas in antwoord 2 (mijn glazen bol is stuk, dus daarom vroeg ik het)
@Antwoord2 : Het gaat niet om mij , volgens mij is voor jouw relevant. Hoe meer info je geeft, hoe makkelijker wij je kunnen helpen
@Antwoord 3 : Misschien een idee ervoor te zorgen dat die data niet vernaggeld word ? Misschien dat wij daarbij kunnen helpen ??


wij = GoTusers
Mijn startpost is imho duidelijk genoeg.

1. Huuh? Jij vraagt of het in een DB moet. Ik zeg, Nee, dat zeg ik nergens. Wat heeft mijn antwoord 2 daar mee te maken dan?
2. Ik geef van begin af aan praktisch het hele verhaal. Het niet relevante gedeelte is de processing door VIPP, dat werkt. Dus vind ik dat niet relevant, en is dat ook niet voor jou relevant!
3. Kijk, dat zou kunnen. Dat is dus een insteek waar ik reeds mee aan het werk ben. En daar zouden jullie misschien mee kunnen helpen, maar dan nog: Het 60K records file moet dan nog steeds gesplitst worden in 1K files.

@Henjo: klopt, het readline gedeelte werkt ook wel, ware het niet dat het tekstfile vanaf de mac een of andere vreemde Linefeed hanteert waar ik nog niet achter ben. Heb er al meerdere geprobeerd, maar steeds 0 op request.

[ Voor 12% gewijzigd door TeeDee op 05-08-2004 16:44 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 15:50

gorgi_19

Kruimeltjes zijn weer op :9

Op verzoek :)

Bud_s, als je een brak topic zie, geef dat dan aan dmv een TR, maar blijf niet doorhameren. :) Teedee, ga er ook niet een paar posts over door; zo krijg je een brak topic :)

[ Voor 88% gewijzigd door gorgi_19 op 05-08-2004 16:51 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo

Pagina: 1

Dit topic is gesloten.