Tekst uitlezen uit txt

Status
Niet open voor verdere reacties.

CarlosValderram

Gebruiker
Lid geworden
23 sep 2008
Berichten
21
Hallo,

Ik heb een txt-bestand. Daarin zitten een aantal plaatsen die ik er uit wil knippen om verder te gebruiken in een ander, nieuw te maken (CSV) bestand.
Concreet moet het nummer onder Customer nummer worden geselecteerd en de verschillende rijen onder item no. en Qty, zoveel als dat er zijn.

Ik dacht dat dit gemakkelijk zou gaan met VBA. Is dat handig?

Groet!
 

Bijlagen

Gegevens die op 1 rij (record) horen staan in jouw bestand in 20 regels.
Kun je geen CSV-bestand als uitvoer krijgen ? Of anders een specificatie van de lengte van de verschillende velden.
 
Nee, helaas ben ik volledig afhankelijk van een ander wat de uitvoer betreft. Ik zal het dus echt moeten doen met het txtbestand. Op zich is de stap tussen txt en csv niet groot, maar niet gemakkelijk met meerdere regels.
Bijgevoegd heb ik nu de zogenaamde definitie van het bestand, maar nog steeds uitgaande van meerdere regels. Op zich kan ik 90% van de regels gewoon weggooien, maar ik blijf altijd met meerdere regels werken, dat kan echt niet anders.

Is het in een macro (VBA) niet gewoon mogelijk om een cel te selecteren, Range("A1").Select en die in een variabele op te slaan en daar vervolgens bewerkingen op te doen, bijvoorbeeld mid(var, 7,30) of iets dergelijks?
En daarnaast de regels met qty en code in een array stoppen en daar soortgelijke bewerkingen op te doen?
 

Bijlagen

In wordpad ziet je file er zo uit. Ik heb even alles geselecteerd zodat je kan zien hoeveel regels het zijn.

Tijdens het inlezen van je file moet je regels tellen waar de informatie staat die je wilt hebben. Dus op de vierde regel vanaf het 20e karakter en na een regel of 27 begint het weer opnieuw.

HTH:D
 
Als je het bestand opent in Word kun je deze macro draaien:

Code:
Sub tst()
  sq = Filter(Split(ActiveDocument.Content, Chr(10)), " ")
  For j = 0 To UBound(sq)
    If InStr(sq(j), "Customer No.") > 0 Then
      c0 = Trim(Mid(sq(j + 1), 10))
      c0 = Replace(Trim(Left(c0, Len(c0) - InStr(StrReverse(c0), " "))), " ", "")
    ElseIf InStr(sq(j), "Qty") > 0 Then
      c1 = sq(j + 1)
    End If
  Next
End Sub

Het klantnummer komt in variabele c0 te staan.
de gegevesn onder de lijn met Qty komt in varabele c1.

Puzzel eerst maar even totdat je de code begrijpt.
 
Laatst bewerkt:
Als je het bestand opent in Word kun je deze macro draaien:

Code:
Sub tst()
  sq = Filter(Split(ActiveDocument.Content, Chr(10)), " ")
  For j = 0 To UBound(sq)
    If InStr(sq(j), "Customer No.") > 0 Then
      st = Split(Replace(sq(j), "Customer No.", "|Customer No.|"), "|")
      c0 = Trim(Mid(sq(j + 1), 10))
      c0 = Replace(Trim(Left(c0, Len(c0) - InStr(StrReverse(c0), " "))), " ", "")
    ElseIf InStr(sq(j), "Qty") > 0 Then
      c1 = sq(j + 1)
    End If
  Next
End Sub

Het klantnummer komt in variabele c0 te staan.
de gegevens onder de lijn met Qty komt in varabele c1.

Puzzel eerst maar even totdat je de code begrijpt.

Jij werkt zeker veel met Word?
Ik zou het oplossen in Access. Daar doe ik veel in.

Het Filter commando ken ik niet. Verder zie ik dat je het hele bestand in een array inleest. Lekker snel.
Ik weet alleenniet waarvoor je een array st vult
Code:
      st = Split(Replace(sq(j), "Customer No.", "|Customer No.|"), "|")
Bedankt voor je code. Ziet er compact uit!
 
Die regel met st is nog een rudiment van een eerdere methode om de gegevens uit te lezen. Die kan verwijderd worden.
De code heeft eigenlijk niets met Word te maken, met uitzondering van Activedocument.content. De rest is gewoon algemene VBA.
Voor het bewerken van tekst (en daar ging het hier om) lijkt mij Word het meest aangewezen. Access lijkt me niet voor de hand liggend (Excel evenmin).
 
Als je het bestand opent in Word kun je deze macro draaien:

Code:
Sub tst()
  sq = Filter(Split(ActiveDocument.Content, Chr(10)), " ")
  For j = 0 To UBound(sq)
    If InStr(sq(j), "Customer No.") > 0 Then
      c0 = Trim(Mid(sq(j + 1), 10))
      c0 = Replace(Trim(Left(c0, Len(c0) - InStr(StrReverse(c0), " "))), " ", "")
    ElseIf InStr(sq(j), "Qty") > 0 Then
      c1 = sq(j + 1)
    End If
  Next
End Sub

Het klantnummer komt in variabele c0 te staan.
de gegevesn onder de lijn met Qty komt in varabele c1.

Puzzel eerst maar even totdat je de code begrijpt.

Ik heb het idee dat het volgende gebeurd:
regel 1: alle regels worden in een array gestopt, ik snap alleen chr(10) niet.
regel 2: variabele j loopt van 0 tot het einde van de array
regel 3: als in regel j van de array Customer No. staat, voert hij regel 4 en 5 uit.
regel 4: Dan haalt hij uit de volgende regel (j+0) het nummer vanaf positie 10.
regel 5: alle witruimten rondom het customerno. worden weggehaald, en er worden quotes om het nummer gezet.
regel 6: als er Qty in de regel van de array zit, wordt de volgende regel in een variabele gezet.

Volgens mij snap ik zo ongeveer wat deze macro doet, toch? Wel heb ik nog enkele opmerkingen er over, hieronder.

Opmerkingen:
- Wat als er meerdere orderregels zijn (onder Qty), dat zal namelijk vaak gebeuren?
- Is het mogelijk vanuit Word de resultaten van deze functie nog wel naar een (aan te maken) CSV te schrijven?
 
Ik heb het idee dat het volgende gebeurd:
regel 1: alle regels worden in een array gestopt, ik snap alleen chr(10) niet.
regel 2: variabele j loopt van 0 tot het einde van de array
regel 3: als in regel j van de array Customer No. staat, voert hij regel 4 en 5 uit.
regel 4: Dan haalt hij uit de volgende regel (j+0) het nummer vanaf positie 10.
regel 5: alle witruimten rondom het customerno. worden weggehaald, en er worden quotes om het nummer gezet.
regel 6: als er Qty in de regel van de array zit, wordt de volgende regel in een variabele gezet.

Volgens mij snap ik zo ongeveer wat deze macro doet, toch? Wel heb ik nog enkele opmerkingen er over, hieronder.

Opmerkingen:
- Wat als er meerdere orderregels zijn (onder Qty), dat zal namelijk vaak gebeuren?
- Is het mogelijk vanuit Word de resultaten van deze functie nog wel naar een (aan te maken) CSV te schrijven?

Bijna raak:
  • een txt-bestand bevat als alineamarkering chr(10), ipv vbcr (chr(13)
  • regel 5: er worden geen " " rondom het nummer gezet
  • het gebruik van een slash bij het klantnummer is vragen om moeilijkheden; ik vervang het hier door een 'underscore' ( _ )

Als er meerdere orderregels zijn

Code:
Sub tst()
  sq = Filter(Split(ActiveDocument.Content, Chr(10)), " ")
  For j = 0 To UBound(sq)
    If InStr(sq(j), "Customer No.") > 0 Then
      c0 = Trim(Mid(sq(j + 1), 10))
      c0 = replace(Replace(Trim(Left(c0, Len(c0) - InStr(StrReverse(c0), " "))), " ", ""),"/","_")
    ElseIf InStr(sq(j), "Qty") > 0 Then
      Do until sq(j+1)=""
        c1 = c1 & sq(j + 1) & "|"
        j=j+1
      loop
    End If
  Next
  Activedocument.content =c0 & ","  & c1
  Activedocument.saveas "E:\filtering.txt", wdformatdostext
End Sub

Wijzig daarna de extensie txt in csv
 
Laatst bewerkt:
Oké, de functie snap ik nu. Als ik het allemaal goed begrijp is het nu nog zaak om de geselecteerde variabelen over te houden en de rest eigenlijk weg te ruimen. Dat doe ik door de variabelen te declareren en de rest van de tekst te deleten (select all, delete)?

Vervolgens moet dit opgeslagen worden als CSV. Dat doe ik simpelweg met ActiveDocument.SaveAs Filename:="test.csv", FileFormat:= _wdFormatText
 
Laatst bewerkt:
Vorige code aangepast.
Omdat je niet hebt aangegeven hoe de uitvoer er uit moet zien heb ik zelf een keuze bepaald. Pas die zonodig aan.
 
Vorige code aangepast.
Omdat je niet hebt aangegeven hoe de uitvoer er uit moet zien heb ik zelf een keuze bepaald. Pas die zonodig aan.

Bij mij werkt dit ook:

ActiveDocument.SaveAs FileName:="H:\test.csv", FileFormat:= _
wdFormatText

Daarmee krijg ik een CSV bestand, zonder de extensie te moeten wijzigen.

Wat ik verder nog moet doen is de opmaak enigzins wijzigen. Maar daar kom ik zelf wel uit, het gaat namelijk om het toevoegen van een aantal tekens en wat extra informatie.

Toch loop ik tegen een probleem aan. Bij het openen van het bestand in Word, wijzigt de opmaak van de regels (zie bijgevoegd bestand). Daardoor klopt de code niet meer. Snap jij dit?
Daarnaast nog een probleem: "Het subscript valt buiten het bereik". Die foutmelding krijg ik op regel Do until sq(j+1)=""
 

Bijlagen

Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan