Gå til innhold

Hjelp til et lite perl script - Konvertering CSV -> TXT med formatering


Anbefalte innlegg

Har en utfordring som er som følger.

 

Har en telefonliste fra excel (eksportert til csv (faste felt, men variabel antall oppføringer) som jeg på en enkel måte må konvertere til en noenlunde formatert text fil.

 

Telefonliste.csv

Name;Mobile;Home;Other
Navn 1;44444444;77777777;
Navn 2;55555555;66666666;66655544
Navn 3;;44446666;
Navn 4;45454545;;65656565
Navn 5;;43343434;

 

til sånn noenlunde formatert telefonliste.txt

 

post-9965-0-34696200-1362733686_thumb.jpg

 

Har fått forståelse for at perl den letteste måte å gå.

 

Et lite skript som lar deg kjøre konverter.pl telefonliste.csv

og output blir til telefonliste.txt

 

Har aldri rørt perl, men hvis noen har forslag på et scipt setter jeg stor pris på det.

 

Hvis ikke blir det selvstudie i helgen :)

Endret av Arcus
Lenke til kommentar
Videoannonse
Annonse

#! /usr/bin/perl

use strict;
use warnings;

while( my @line = split ';', <> ) {
format output =
@<<<<<<<<<< @<<<<<<<<<< @<<<<<<<<<< @<<<<<<<<<<
@line
.
$~ = 'output';
write;
}

 

Output:

lycantrophe@tesla:~$ perl csv.pl < comma.txt
navn		tlf	   10		14
tolf		nevn	  11		12

 

Edit: Hahaha, diskusjon er så brukket. Hvis formateringen ser borked ut er det d.no.

Endret av Lycantrophe
Lenke til kommentar

Om du skal ha med headlines (og et par "forenklinger"):

 

#!/usr/bin/perl

use strict;
use warnings;

format headline =
Name		Mobile	  Home		Other
.
$~ = 'headline';
write;

format content =
@<<<<<<<<<< @<<<<<<<<<< @<<<<<<<<<< @<<<<<<<<<<
@_
.

$~ = 'content';

write while( @_ = split ';', <> );

 

Output:

lycantrophe@tesla:~$ perl csv.pl < comma.txt
Name		Mobile	  Home		Other
navn		tlf		 10		  14
tolf		nevn		11		  12

 

Bruk: perl script.pl < input.csv > output.txt

 

Vil du heller ha filhåndtering i scriptet lar det seg gjøre det og.

Endret av Lycantrophe
Lenke til kommentar

Okei, pliiz ikke ta det følgende som en pissing contest, jeg syns bare det er ganske kult fra et programmeringssynspunkt:

Hver linje i filen via import-csv blir et eget objekt med automatiske properties og metoder, f.eks vil hvert objekt i dette tilfellet få en Name property og en Home property. Greit nok, men det som er nice er at man da kan sende objektene videre via gode gamle pipes:

Import-Csv -Delimiter ";" .\Telefonliste.csv | where {$_.Name -Match "Lyc*}

som da vil gi hver entry som har en string i Name-kolonnen som starter med "Lyc". Siden "entryen" er objektet, så vil den ha alle propertyene fra den originale raden. Igjen, vil ikke tråkke på tær, bare gi et innspill til hvorfor jeg personlig liker PowerShell, og syns det er nice fra et get-sh**-done perspektiv :)

Endret av Paull
Lenke til kommentar

grep -e ^Lyc input.txt | column -t -c 4 -s ';' > output.txt

 

lyc'd

 

Edit: Dersom man skal ha noe annet enn første rad (f.ex andre)

 

awk '$1 ~ /lyc/  {print $0}' comma.txt | column -t -s ';'

 

Dette gir deg regex også, mulig PS har det.

Endret av Lycantrophe
Lenke til kommentar
Har fått forståelse for at perl den letteste måte å gå.

Hmm det kan diskuteres,selv om @Lycantrophe er glad for at det endelig kommer et Perl spørsmål ;)

 

Blir med jeg og bare for gøy,tar en med Python.

Kunne nok ha kortet ned koden en del,men her er formatering nøyaktig som vist på bildet.

Tar lenge fra lengste tekst og formatere tekst etter max lengde.

Bruker Python sin nye string formatting som er kraftig vist her av Gribouillis i linken.

Som info har Python bygd inn CSV module som kunne vært brukt.

 

Diskusjon er broken.

Ja det er helt klart,så man får bruke andre sider når man skal vise kode med formatering.

http://pastebin.com/tnXYVX0t

Endret av SNIPPSAT
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...