Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: Onbekende datum in document vinden en deze vervolgens aan bestandsnaam toevoegen  (gelezen 2656 keer)

Offline JanSloep

  • Lid
Hallo,

Ik ben bezig met het inventariseren van een paar honderd papieren documenten die ik ooit in het verleden heb ontvangen. Deze documenten heb ik eerst gescand en met OCR in tekst doorzoekbare PDF's omgezet.
De bestanden hebben nu als bestandsnaam Document0001.pdf...002.pdf ...003.pdf etc.

Nu wil ik deze documenten op de datum die in het document zelf staat kunnen sorteren door deze datum aan de bestandsnaam toe te voegen. Deze (onbekende) datum staat vrijwel altijd in het formaat 01-01-99 of 01-01-1999

De opdracht grep *-*-* *.pdf geeft keurig netjes aan in welke bestanden een datum in dit formaat staat. Waar ik echter niet uitkom is hoe ik die gevonden datum nu aan de bestandsnaam toe kan voegen. Ik weet niet eens of grep ook daadwerkelijk de gevonden datum als resultaat weer kan geven of alleen een vlag heeft gezet dat er iets is gevonden dat aan de zoekcriteria (*-*-*) voldoet.

Is er iemand die me hier verder mee kan helpen?

Met de -o optie geeft grep alleen de match terug, is dat wat je zoekt? Dus als in een regel bijvoorbeeld "14-7-2011" voorkomt dan krijg je alleen dat terug en niet de rest van de regel. Vermits je natuurlijk de juiste reguliere expressie gebruikt.




Offline JanSloep

  • Lid

Hallo Erik,

Dat is in inderdaad wat ik wil.

En dit is wat ik geprobeerd heb, maar krijg geen output

for f in *.pdf
do
      grep -o "-*-*-*" *.pdf | datum
      echo $datum
done

Staat er niet een streepje teveel? je zou het zo eens kunnen proberen.

for f in *.pdf
do
      datum=$(grep -o "*-*-*" $f)
      echo $datum
done

Overigens denk ik dat je expressie te ruim is, volgens mij zou "a-b-c" nu ook worden gezien als datum.


Offline JanSloep

  • Lid
Nee dat klopt, is fout gegaan met het kopieeren van de tekst. Mijn script is was wel goed maar er komt helemaal geen output uit. Ik krijg toch de indruk dat greb alleen een vlag zet.
Wat dat a-b-c betreft heb je natuurlijk gelijk in, maar daar kan ik uiteraard is op testen. Het gaat me er nu alleen om dat ik die datum uit greb krijg, maar dat lukt niet

Als ik namelijk dit doe

for f in *.pdf
do
  grep -o "*-*-*" $f
done

dan krijg ik : Binair bestand Document0036.pdf bevat de gezochte tekst.
« Laatst bewerkt op: 2011/07/14, 16:33:48 door JanSloep »

Het zit er misschien ook in hoe je de scriptjes uitvoert, sla je ze op in een bestandje of typ je ze zo in de terminal?

Heb zelf even zitten rommelen en ben hier op uitgekomen. Heb het getest met wat tekstbestanden die de extensie .txt hebben. Dit is nog niet geschikt om direct in te zetten hoor, moet nog wat aan worden bijgeschaafd.

#!/bin/bash
folder=""
for f in $(ls $folder) #alle bestanden in die map
do
founddate=$(grep -o "[0-9]\{1,2\}-[0-9]\{1,2\}-[0-9]\{2,\}" $f)
if [[ $founddate != "" ]]
then
res=$(echo $f | grep $founddate) #heeft de bestandsnaam misschien al een datum?
if [ ${#res} -gt 0 ]
then
echo "bestandsnaam bevat al datum: "$f
else
old=$f
ext=$(echo $f | cut --delim="." -f 2) #pak de extensie
new=$(echo $f | cut --delim="." -f 1)"_"$founddate"."$ext
mv -i $old $new #hernoem
fi
fi
done

« Laatst bewerkt op: 2011/07/14, 16:49:21 door erik1984 »

Offline JanSloep

  • Lid
Hoi eric

Nee ik heb verschillende testen in allerlei bestandjes staan. Maar het copy en paste ging niet goed waardoor ik foutief handmatig had aangevuld.

 Wat ik me ook realiseer dat het er helemaal niet doet dat het een pdf bestand is. In een normaal tekstbestand moet het ook werken. Ik heb even de tekst uit een factuur gehaald waar ook zo'n datum in staat. Ik zal jouw verhaal ook even testen

 Debiteurennr.            Tijd              Medewerker                        Factuurdatum           Factuurnummer

 2510012345                15:23             PATTUK                            13-05-11               2510644375
 Aantal    Artikelnummer         Omschrijving                                                      Prijs           Totaal

       1   20005053              HI 3.5" SATAN 1TB/7200RPM/32MB SAMSUNG                    €      49,95    €        49,95
                                 Serienr.:    S246J8ABC00978
« Laatst bewerkt op: 2011/07/14, 17:05:35 door JanSloep »

Als ik die tekst in een bestandje plak, en dat factuurtest.txt noem en mijn script uitvoer dan wordt het hernoemd naar factuurtest_13-05-11.txt

Opzich lijkt het scriptje dus te werken, de basis staat, maar er zitten nog wat zwakheden in. Dus misschien kun je er op voort bouwen of zelf even opnieuw beginnen met dit als inspiratie ;) Zwakheden zijn dat de reguliere expressie nog wat beter kan (nu nog steeds wat ruim), dat ie nu niet om kan gaan met 2 grep-resultaten (indien er twee datums worden gevonden in een bestand) en dat er van wordt uitgegeaan dat de bestandsnaam altijd de vorm naam.extensie heeft.

Offline JanSloep

  • Lid
Dat is heel vreemd. Ik heb mijn ocr programma ook gewone kale tekst bestanden met de extensie txt aan laten maken van de gescande bestanden en daar jou prog op los gelaten en krijg dan de boodschap  "not found" (De tekst die ik gestuurd heb is daar een uittreksel van) Ik moet nog even checken wat je progje als input verwacht, misschien zit het daar fout.

Het is nog gekker. Ik heb zelf ook de tekst die ik hier had geplaatst hier weer opgehaald en ook in een bestand factuurtest.txt geplaatst en daar je progje op los gelaten. Wederom zonder resultaat.

In ieder geval heel erg bedankt. Ik ga wel verder proberen met jouw progje, maar begrijp absoluut niet wat ik nu fout doe.

Ik hou je op de hoogte,

Groet Jan

« Laatst bewerkt op: 2011/07/14, 17:35:59 door JanSloep »

Het is wel belangrijk dat de bestanden die je wil veranderen in dezelfde map staan als het scriptje tenzij er een ander pad wordt opgegeven (door de variabele folder aan te passen). Verder heeft het script eigenlijk geen invoer nodig. Maargoed mijn script is ook meer een voorzetje dan een serieuze oplossing. Vooral ook omdat ik het zelf leuk vind om met bash te prutsen ;)

Offline JanSloep

  • Lid
Hallo Erik,

Nog  bedankt voor je hulp. Het volgende deel van je script liet zien dat het ook bij mij werkt op  txt bestanden (En uiteraard staan alle bestanden in dezelfde map  =D)

#!/bin/bash
folder=""
for f in *.txt #alle txt bestanden in die map
do
   founddate=$(grep -o "[0-9]\{1,2\}-[0-9]\{1,2\}-[0-9]\{2,\}" $f)
   echo "Gevonden datum is: "$founddate
done

Het werkt echter niet bij tekst doorzoekbare pdf bestanden. Mogelijk dat je de tekstlaag apart moet benaderen en niet het complete pdf bestand. Maar ik weet nu in ieder geval dat die datum er in principe moet zijn uit te halen. Daar ben ik al erg blij mee.

Desnoods laat ik tijdens het OCR proces de tekst ook in een apart tijdelijk TXT bestand plaatsen, waar ik dan de datum uit kan halen om in de PDF bestandsnaam op te nemen, waarna het TXT bestand weer kan worden verwijderd

Inderdaad leuk met die scriptjes bezig te zijn, maar het is lang geleden dat ik zoiets deed. Ben in een heel grijs verleden ooit Pascal programmeur geweest, maar ik merk nu dat dat behoorlijk ver is weggezakt.

Groet, Jan
« Laatst bewerkt op: 2011/07/14, 19:42:44 door JanSloep »

Misschien kun je hier iets mee,

#!/bin/bash
folder=""
for f in *.pdf #alle pdf bestanden in die map
do
   echo filename: $f
   founddate=$(pdftotext $f - 2>/dev/null | grep -o "[0-9]\{1,2\}-[0-9]\{1,2\}-[0-9]\{2,\}")
   echo "Gevonden datum is: "$founddate
done

Ik heb eigenlijk alleen dit stukje toegevoegd,
pdftotext $f - 2>/dev/null

pdftotext zet het pdf bestand om in text en stuurt het resultaat naar stdout ( middels  - ), welke naar grep gepiped wordt.  De 2>/dev/null staat er alleen in om foutmeldingen uit de output van pdftotext te filteren, misschien beter om dat weg te halen.

Dat is handig, bedankt. Nou ja vooral voor de TS maar ik kende dat commando ook nog niet. Het streepje is wel essentieel heb ik gemerkt  :D

grep -b behandelt binaire bestanden als tekstbestanden.

Dus...
for f in *.pdf; do
   date=$(grep -ob "[0-9]\{1,2\}-[0-9]\{1,2\}-[0-9]\{2,\}" "$f")
   mv "$f" "$(basename "$f" .pdf)-${date}.pdf"
done
« Laatst bewerkt op: 2011/07/15, 10:23:20 door SeySayux »
I use a Unix-based system, that means I'll get laid as often as I have to reboot.
LibSylph
SeySayux.net