stränghantering?

Tråden skapades och har fått 9 svar. Det senaste inlägget skrevs .
1

tjena!

Nu sitter jag här med ett textdokument om 380 rader. Varje rad innehåller uppgifter om en postadress. Alla adresserna är uppbyggda enligt det klassiska mönstret:
namn förnamn gatuadress 23 12345 postadress
Dessa uppgifter separeras endast av ett mellanslag med undantag för posterna som separeras med Carrage Return (eller 'nytt stycke' kanske det heter på svenska)
En del gatuadresser saknar uppgift om gatunumer och kanske är lite lurigare att redigera en masse.

Vad jag vill göra med dessa adress-uppgifter är att importera dem i en sql-databas och jag antar att det finns metoder att 'klippa' ut all sammanhängande text fram till nästa mellanslag, eller så....

Jag har för mig att sånt här kallas stränghantering.

Min fråga till er är hur gör jag detta enklast och i vilket program? Funkar textredigeraren eller kanske sub-etha-edit eller så?

namn förnamn gatuadress 23 12345 postadress
namnet förnamn gatuadress  12345 postadress
dubber-namn förnamn gatuadress 23 12345 postadress
namn förnamnet gatuadress 3 12345 postadress
namn förnamn gatuadress  12345 postadress
namnet förnamnet gatuadress  12345 postadress

så här ser adresslistan ut

Enklast låter som om du får bygga någon snurra i valfritt språk för att importera detta i databasen.
Det blir mer jobb eftersom du har en distink avskiljare mellan de olika fälten.

Jag skulle först se till att få in komma tecken så du sedan enkelt kan importera in i databasen.

Är det mysql så har phpmyadmin importmöjligheter.

Ursprungligen av Mattias Hedman:

Enklast låter som om du får bygga någon snurra i valfritt språk för att importera detta i databasen.
Det blir mer jobb eftersom du har en distink avskiljare mellan de olika fälten.

Jag skulle först se till att få in komma tecken så du sedan enkelt kan importera in i databasen.

Är det mysql så har phpmyadmin importmöjligheter.

hm.... jag bygger inga snurror till vardags. är det lika lätt som det låter:) jasså inte det...
nåväl, tillsvidare så har jag på din inrådan bytt ut varje mellanslag ' ' mot ett komma+mellanslag ', ' så nu letar jag fram ett veckans OBS-sändningar på sr.se och plockar bort alla 380 kommatecken som åtskiljer gatuadress och dess nummer. Alla sätt är bra...

Det blir ganska besvärligt att dela upp på ett bra sätt eftersom personer kan ha dubbla förnamn och efternamn, gatunamn kan bestå av flera ord och husnummer inte alltid verkar ingå. Det gör informationen ganska tvetydig. Konvertera det hela till giltig CSV så att det ser ut ungefär så här:

Bengt Erik, Bengtsson, Västra Kyrkogatan 123, 123 45, Testköping

När det är gjort kan du köra in det hela i databasen rakt av, om vi säger att du sparar filen som /tmp/adresser.csv kan du importera filen med sql-kommandot LOAD DATA INFILE (mysql) eller COPY (postgresql m.fl.).

Ursprungligen av Samuel K:

Det blir ganska besvärligt att dela upp på ett bra sätt eftersom personer kan ha dubbla förnamn och efternamn, gatunamn kan bestå av flera ord och husnummer inte alltid verkar ingå. Det gör informationen ganska tvetydig. Konvertera det hela till giltig CSV så att det ser ut ungefär så här:

Bengt Erik, Bengtsson, Västra Kyrkogatan 123, 123 45, Testköping

När det är gjort kan du köra in det hela i databasen rakt av, om vi säger att du sparar filen som /tmp/adresser.csv kan du importera filen med sql-kommandot LOAD DATA INFILE (mysql) eller COPY (postgresql m.fl.).

Nu är fälten komma-separerade och posterna CR-separerade. Måste man köra sql-kommandot LOAD DATA INFILE i terminalen eller kan jag köra det i phpmyadmin?

  • Medlem
  • Stockholm
  • 2005-09-15 09:37

Hur ska resultatet se ut? Vilken DBMS använder du? Vad kan denna DBMS importera?

Om man lär sig köra awk i terminalen kan man göra många typer av filvrängningar:

$ man awk

Skapa följande program i filen test.awk

{
if (NF == 5)
print "insert into t values ('" $1 "','" $2 "','" $3 "','" $4 "','" $5 "');";
else
print "insert into t values ('" $1 "','" $2 "','" $3 " " $4 "','" $5 "','" $6 "');";
}

(ändra efter behov)

Kör så här (utan kommatecken mellan fälten):

$ awk -f test.awk < infil > utfil
$ cat utfil
insert into t values ('namn','förnamn','gatuadress 23','12345','postadress');
insert into t values ('namnet','förnamn','gatuadress','12345','postadress');
insert into t values ('dubber-namn','förnamn','gatuadress 23','12345','postadress');
insert into t values ('namn','förnamnet','gatuadress 3','12345','postadress');
insert into t values ('namn','förnamn','gatuadress','12345','postadress');
insert into t values ('namnet','förnamnet','gatuadress','12345','postadress');

Jag kör mysql och phpmyadmin. Det gick förvånansvärt snabbt att jobba sig genom alla raderna och de bör nu vara, om jag inte missat nåt i framfarten, justerade enligt Mattias och Skamuels förslag.

  • Medlem
  • International user
  • 2005-09-15 11:32

Ett mellanslag mellan fälten i varje post gör att du blir tvungen att manuellt separera fälten först. Helt omöjligt annars att få rätt sträng.

Ursprungligen av Wire:

Ett mellanslag mellan fälten i varje post gör att du blir tvungen att manuellt separera fälten först. Helt omöjligt annars att få rätt sträng.

Just den detaljen löste sig hyfsat smidigt dock med viss manuell insats.

Du kan köra det direkt i phpmyadmin under import, vill jag minnas på rak arm.

1
Bevaka tråden