handdator

Visa fullständig version : Städning av GEDCOM inför DISBYT: Behöver lite Regular Expression-hjälp/idéer



tommypeters
2015-08-22, 21:35
Håller på och förbereder mitt data inför DISBYT-inskick och medan jag hittills gjort rättningarna i grunddatat i Ancestry/FTM så är det några saker som jag tycker att jag just nu kan nöja mig med att fixa till i den exporterade GEDCOM-filen, om jag kan göra det med ett script (så det är snabbt och enkelt att köra om det när man exporterar ut en ny GEDCOM).

Jag har jobbat med regular expressions, mest under Unix, för många år sedan men är rostig nu - det känner jag... Laddade ner gratisprogrammet Textcrawler för att göra ändringar i GEDCOM-filen.

Det jag vill fixa till nu är daturmintervall.
Ancestry godkänner ju mycket mer än vad som anses vara god GEDCOM-standard. Det här är exempel på hur det kan se ut på GEDCOM-rader från Ancestry:

2 DATE Bet 1979-1986
2 DATE 11 Jan 1958
2 DATE 1980
2 DATE 1980-1994
2 DATE 14 Nov 1979
2 DATE Bet 1958-1979
2 DATE 1994-
2 DATE Bet Jan 1997-Jun 2006
2 DATE Bet 1979 - 1989
2 DATE Bet 1979 - 1989
2 DATE Bet. 1979 - 1989
2 DATE Bet 26 Jun 1856-26 Jun 1876
2 DATE Bet 1795-12 Oct 1821

Jag vill ju att rader som "2 DATE 1980-1994" ska bli "2 DATE BET 1980 AND 1994",
att "2 DATE Bet. 1979 - 1989" ska bli "2 DATE BET 1979 AND 1989" osv.

Jag började leka lite med någon matchningssträng: DATE Bet[ \.][a-zA-ZåäöÅÄÖ ]*[0-9]+[ ]*(–)|(-)[ ]*
men märkte snabbt att Textcrawlers RE-hjälp och Microsofts RE-översikt är dåliga på exempel och jag har bland annat svårt att få gruppering att fungera korrekt. Jag ska ju stoppe in ett BET om det inte redan finns och byta ut "-" mot "AND" men bara om det finns någon form av datum både före och efter "-".

dis49324
2015-08-23, 07:31
Hej Tommy,
Här är ett litet enkelt Perl-program som verkar fungera (du kan säkert översätta reg-expen till den dialekt och programspråk du föredrar):
#!/usr/bin/perl
while (<>) {
print;
if (/^2 DATE Bet\.?\s(.*[0-9]{4})\s*\-\s*(.*[0-9]{4})$/) {
print "=> 2 DATE BET $1 AND $2\n";
}
}

När jag kör det på dina test-exempel ger det:
2 DATE Bet 1979-1986
=> 2 DATE BET 1979 AND 1986
2 DATE 11 Jan 1958
2 DATE 1980
2 DATE 1980-1994
2 DATE 14 Nov 1979
2 DATE Bet 1958-1979
=> 2 DATE BET 1958 AND 1979
2 DATE 1994-
2 DATE Bet Jan 1997-Jun 2006
=> 2 DATE BET Jan 1997 AND Jun 2006
2 DATE Bet 1979 - 1989
=> 2 DATE BET 1979 AND 1989
2 DATE Bet 1979 - 1989
=> 2 DATE BET 1979 AND 1989
2 DATE Bet. 1979 - 1989
=> 2 DATE BET 1979 AND 1989
2 DATE Bet 26 Jun 1856-26 Jun 1876
=> 2 DATE BET 26 Jun 1856 AND 26 Jun 1876
2 DATE Bet 1795-12 Oct 1821
=> 2 DATE BET 1795 AND 12 Oct 1821

dis49324
2015-08-23, 08:02
Här är ett litet enkelt Perl-program

och nu med kommentarer i reg-expen:
#!/usr/bin/perl
while (<>) {
print;
if (/^2\ DATE\ Bet #Find tag starting at begining of line
\.?\s #separated by possibly a '.' and a space
(.*[0-9]{4}) #followed by anything ending with 4 digits
\s*\-\s* #separated by a '-' and possibly some spaces
(.*[0-9]{4}) #and again followed by anything ending with 4 digits
$/x) #and a linebreak
{
print "=> 2 DATE BET $1 AND $2\n";
}
}

tommypeters
2015-08-23, 11:21
Tack, det som är kvar är då det svårare att rader som "2 DATE 1980-1994" ==> "2 DATE BET 1980 AND 1994"

:-)

dis49324
2015-08-23, 11:45
Tack, det som är kvar är då det svårare att rader som "2 DATE 1980-1994" ==> "2 DATE BET 1980 AND 1994"

:-)
Prova med att göra Bet optional:
#!/usr/bin/perl
while (<>) {
print;
if (/^2\ DATE\s #Find tag starting at begining of line
(Bet\.?\s)? #separated by possibly a 'Bet' and a space
(.*[0-9]{4}) #followed by anything ending with 4 digits
\s*\-\s* #separated by a '-' and possibly some spaces
(.*[0-9]{4}) #and again followed by anything ending with 4 digits
$/x) #and a linebreak
{
print "=> 2 DATE BET $2 AND $3\n";
}
}

tommypeters
2015-08-23, 11:58
Tack, ska pröva det senare idag :-)

tommypeters
2015-08-25, 00:40
Fungerar bra :-)

tommypeters
2017-02-03, 02:15
Nu skulle jag vilja ha någon anropsmöjlighet för att kolla om orten i min GEDCOM är en församling, ett län, en ort eller liknande som finns i DIS. Kan ju vara som en lååång lista sm deklareras i PERL och söks i i min städningsrutin.

dis49324
2017-02-03, 07:48
Nu skulle jag vilja ha någon anropsmöjlighet för att kolla om orten i min GEDCOM är en församling, ett län, en ort eller liknande som finns i DIS. Kan ju vara som en lååång lista sm deklareras i PERL och söks i i min städningsrutin.

Det låter som en av del-funktionerna i openRGDs indatavalidering - https://rgd.dis.se:8088/login
som Carl-Johan Gustavsson har skrivit i PHP.

C-J Gustafsson
2017-02-03, 09:56
Den församling/land tabell som openRGD jämför mot överensstämmer inte med DISGEN utan är i grunden Skatteverkets församlingstabell.
Det största mängden är samma men det finns också skillnader.

Det känns som funktionen "konvertera till Disgen orter" skulle vara det bästa verktyget för att få sina orter verifierad mot Disgen.

tommypeters
2017-02-03, 10:52
Situationen är denna:

Min släktforskning är relativt omfattande och är dels gjord under två perioder och dels gjord av två personer, fick rätt mycket från min syssling på pappas sida och slog ihop med mitt.

Allt är inmatat på Ancestry och jag har Family Tree Maker som släktforskningsprogram. Jag funderade för ett par år sedan på att göra en konverteringsrutin till Disgen så att jag skulle få med allt (för mycket jobb att manuellt t.ex knyta 29268 bilder, foton + AD, till rätt event på rätt person...) men dels kändes DisGen då inte tillräckligt bra och dels har Ancestry/FTM problem med att få en fullständig GEDCOM-export korrekt. Så det blev att fortsätta i Ancestry/FTM, vilket också passar mig rätt bra då jag nu söker på släktens många utvandrare.

Problemet är att datat är inmatat på två olika sätt, det första blev på det sätt som ett tag förordades på Ancestry och resten på det nu vedertagna sättet. ("Torhamn, Attanäs 12, Blekinge län" resp. "Attanäs 12, Torhamn, Blekinge län").
Första försöket var att göra korrigeringar i FTM, om jag hade 25 med "Torhamn, Attanäs 12, Blekinge län" så blev ju ändå alla rättade samtidigt. Men sedan såg jag omfattningen av det manuella arbetet, gissningsvis är det fortfarande 10000 personer av 43000 som fortfarande behöver korrigeras. Och de flesta adresser som många hade gemensam är nu fixade.

Då föddes tanken att låta Ancestry/FTM-datat så länge vara som det är och för nu enbart göra rutiner som rättar GEDCOM-filen så det blir korrekt i DisByt. DisByt kan ju ta filer med den ena eller den andra ordningen, men inte blandat. Det vore inte så svårt att koda DisByt inläsningsrutin så att den kunde hantera det, men inläsningstiden skulle då bli olidligt lång och det skulle ju ske även för alla som inte har GEDCOM med blandat adressformat. Bättre då att de som har detta problem kan köra detta hemma inlämning av GEDCOM.

Problemet är då att för att säkert kunna avgöra vad i en adress som är vad och vända de som är omkastade behövs ett ortsregister att jämföra mot i en rutin man kör hemma. Antingen som en rutin man anropar, som en lång lista man tar med i sitt skript och gör uppslag mot, eller något annat sätt...

C-J Gustafsson
2017-02-03, 13:41
Om radera i GEDCOM filen konsekvent ser ut som detta exempel med med tre grupperingar och prydliga kommatecken så går det säkert att göra ett program som skiftar ordningen.

Den modifierade GEDCOM filen måste sen användas för att uppdatera original posterna, annars måste ju en sådan manipulering göras varje gång en GEDCOM fil skall användas.

Vi kan försöka hjälpa till med att göra detta under förutsättning att det från den modifierade GEDCOM filen går att uppdatera originalet.

tommypeters
2017-02-04, 02:12
Nej, det går inte att uppdatera originalet för tillfället (ska kontakta de som tagit över Family Tree Maker från Ancestry för att höra om de kan lägga till en 100%-ig export & import, inklusive alla medialänkar, till programmet) - det är därför som jag ser det ebda vettiga i att var och en kör rutinen själv hemma för att städa upp sin GEDCOM. För mig gör det då ingenting om det tar åtta timmar eller mer att gå igenom och korrigera, jag tar bara ut en GEDCOM om året ungefär, men för ett DisBytombud är det ohanterligt.

Det är ju inte konsekvent tre grupper, ibland kan det vara "Torhamn, Blekinge län" och ibland kanske bara "Blekinge län". Men det ser jag inte som så ohanterligt utan det är att skapa ett eget ortsregister för kontroll som känns lika onödigt som att uppfinna ett nytt hjul.

Får jag hjälp med detta hoppas och tror jag att jag kan göra resten, i alla fall med lite hjälp som i början på tråden - det var ett tag sedan jag skriptspråkade. Slutresultatet släpper jag förstås till DIS så att andra - som vågar - kan använda det.

C-J Gustafsson
2017-02-04, 12:03
Jag förstår att alla inte består av tre gruppen, det jag menar är om de som skall förändras har samma mönster.

Skicka din GEDCOM fil till mig så får jag kolla om det går att göra ett fix program för detta.

Det är troligen som du säger att du själv kunde fixa ett sånt program, men då krävs det att Dis ledning är villiga att lämna ut tabellen som används i openRGD eller i Disgen. openRGD är ett pilotprojekt, så tabellerna är inte kvalitetskontrollerade på ett sådant sätt att de är lämpliga för någon spridning.

m04041
2017-02-04, 16:27
Tabellerna i Disgen kan man lätt läsa med sqlitebrowser (gratisprogram), eftersom den nya databasen använder sqlite. Kopiera gärna databasen disgen.db först, så man inte av misstag ändrar på något.

tommypeters
2017-02-05, 02:05
OK, tack, ska fixa fram en GEDCOM i morgon.
...och jag använder inte Disgen.

tommypeters
2017-02-06, 11:48
Hur skickar jag GED-filen til dig, C-J?

Den innehåller en hel del saker som RGD klagar på, till exempel sådant som att både en persons biologiska och fosterföräldrar är angivna. Plus förstås en del direkta fel...

C-J Gustafsson
2017-02-06, 12:35
Maila till 08.5545912@telia.com

Om openRGD "klagar" på något så kommer den nog att göra det även i fortsättningen.

tommypeters
2017-02-06, 12:38
Jo, men jag lägger inte ner tid på att manuellt plocka bort fosterföräldrar från GEDCOM-filen förrän det är dags för inskick till DisByt. Nu ska ju du kolla på mina omkastade adresser. Hur skickar jag filen?

Varför klarar för resten RGD inte fosterföräldrar? Design eller inte tänkt på?

C-J Gustafsson
2017-02-06, 12:47
openRGD klarar fosterföräldrar, varningen är till för att uppmärksamma användaren om det. Beroende på vad GEDCOM filen skall användas till får användaren själv avgöra om det kan ställa till problem.

Det är så med alla "felmeddelanden" som openRGD ger, det är bara indikation på något man bör kolla upp.

Det finns också rent formella felaktigheter som gör att GEDCOM filen inte kan användas, men även då försöker openRGD att analysera felet och meddela detta.

tommypeters
2017-02-06, 12:51
RGD kallar det för strukturfel:

*** F E L L I S T A (II) Strukturfel

Formellt fel i GEDCOM filen: Barn I11011, som finns i familj F5299, finns även i familjen F10465

* * * GEDCOM filen skall inte användas innan formella felaktigheter är korrigerade.

C-J Gustafsson
2017-02-06, 13:29
OK då, texten skrevs för rätt länge sedan, nu klarar t.ex. Disgen 2016 av att hantera icke-biologiska relationer. Men det finns fortfarande släktforskningsprogram som inte gör det.

Det jag tänkte på var att openRGD bearbetar hela GEDCOM filen i alla fall och ger övriga meddelanden till användaren.

C-J Gustafsson
2017-02-06, 15:17
Undrade varför det inte kom något mail och så att jag tappat bort den del av mailadressen

Sorry, skall vara 08.55245912@telia.com

tommypeters
2017-02-06, 17:38
OK, GEDCOM skickad :-)