Försöker konvertera en komma-separerad fil till html.. Hjälp.

Trädvy Permalänk
Medlem
Plats
Kristinehamn
Registrerad
Maj 2002

Försöker konvertera en komma-separerad fil till html.. Hjälp.

Jag har en fil som har en otrolig massa entries som ser ut som följer:
Kalle,Anka
Kajsa,Anka
Knatte,Anka jr
osv osv

Den output jag vill ha är:
<tr onmouseover="this.style.backgroundColor='#ffff66';" onmouseout="this.style.backgroundColor='#d4e3e5';">
<td>Kalle</td><td><b>Anka</b></td>
</tr>
<tr onmouseover="this.style.backgroundColor='#ffff66';" onmouseout="this.style.backgroundColor='#d4e3e5';">
<td>Kajsa</td><td><b>Anka</b></td>
</tr>
<tr onmouseover="this.style.backgroundColor='#ffff66';" onmouseout="this.style.backgroundColor='#d4e3e5';">
<td>Knatte</td><td><b>Anka jr</b></td>
</tr>

Jag har försökt få till det genom att skapa ett shellscript som ser ut såhär:

#!/bin/bash
while read INPUT ; do
echo "\"<tr onmouseover=\"this.style.backgroundColor='#ffff66';\"";
"<tr onmouseover="this.style.backgroundColor='#ffff66';"

echo "\"onmouseout=\"this.style.backgroundColor='#d4e3e5';>"
"onmouseout="this.style.backgroundColor='#d4e3e5';>

echo "\"<td>\${INPUT//,/</td><td><b>}</b></td></tr>\";\""
"<td>${INPUT//,/</td><td><b>}</b></td></tr>";"
done

men det går helt enkelt inte, echo gillar inte alla "'s som finns och tror dessutom att >< och tr är kommandon.. Så jag vill helst prova med awk istället, eller sed, eller kanske perl.. Någon som har nåt förslag på hur jag bäst åstadkommer mitt mål? Har aldrig använt vare sig sed eller awk, så jag är lite nollställd.

SNÄLLA CITERA MIG OM NI VILL ATT JAG SKA HITTA TILLBAKS TILL TRÅDEN

Trädvy Permalänk
Medlem
Plats
Lund
Registrerad
Jan 2014

Jag sitter nu för tiden bara i python så jag skriver lösningen i detta men det är nog snyggare att använda något terminalprogram.

Ett problem med strängarna du försöker använda är att de innehåller både " och '. Välj en av dem och kör escape (\) innan de andra.

I python ser det ut så här till exempel:

def to_html(names): html_string = '' for person in names.split('\n'): person_name = person.split(',') html_string += """<tr onmouseover="this.style.backgroundColor='#ffff66';" onmouseout="this.style.backgroundColor='#d4e3e5';">""" html_string += '\n' + '<td>{}</td><td><b>{}</b></td>\n'.format(person_name[0], person_name[1]) return html_string

>>> text = "Kalle,Anka\nKajsa,Anka\nKnatte,Anka jr" >>> to_html(text) <tr onmouseover="this.style.backgroundColor='#ffff66';" onmouseout="this.style.backgroundColor='#d4e3e5';"> <td>Kalle</td><td><b>Anka</b></td> <tr onmouseover="this.style.backgroundColor='#ffff66';" onmouseout="this.style.backgroundColor='#d4e3e5';"> <td>Kajsa</td><td><b>Anka</b></td> <tr onmouseover="this.style.backgroundColor='#ffff66';" onmouseout="this.style.backgroundColor='#d4e3e5';"> <td>Knatte</td><td><b>Anka jr</b></td>

i7-7800x | ASUS Strix GTX 1080 | 64 GB RAM (for datascience stuff)

Trädvy Permalänk
Medlem
Plats
Kristinehamn
Registrerad
Maj 2002
Skrivet av Tetratrio:

Jag sitter nu för tiden bara i python så jag skriver lösningen i detta men det är nog snyggare att använda något terminalprogram.

Ett problem med strängarna du försöker använda är att de innehåller både " och '. Välj en av dem och kör escape (\) innan de andra.

I python ser det ut så här till exempel:

def to_html(names): html_string = '' for person in names.split('\n'): person_name = person.split(',') html_string += """<tr onmouseover="this.style.backgroundColor='#ffff66';" onmouseout="this.style.backgroundColor='#d4e3e5';">""" html_string += '\n' + '<td>{}</td><td><b>{}</b></td>\n'.format(person_name[0], person_name[1]) return html_string

>>> text = "Kalle,Anka\nKajsa,Anka\nKnatte,Anka jr" >>> to_html(text) <tr onmouseover="this.style.backgroundColor='#ffff66';" onmouseout="this.style.backgroundColor='#d4e3e5';"> <td>Kalle</td><td><b>Anka</b></td> <tr onmouseover="this.style.backgroundColor='#ffff66';" onmouseout="this.style.backgroundColor='#d4e3e5';"> <td>Kajsa</td><td><b>Anka</b></td> <tr onmouseover="this.style.backgroundColor='#ffff66';" onmouseout="this.style.backgroundColor='#d4e3e5';"> <td>Knatte</td><td><b>Anka jr</b></td>

Installerade python och försökte detta .. Inte använt python knappt alls.. Men jag får:
>>> text = "Kalle,Anka\nKajsa,Anka\nKnatte,Anka jr"
>>> to_html(text)
Traceback (most recent call last):
File "<pyshell#7>", line 1, in <module>
to_html(text)
NameError: name 'to_html' is not defined

SNÄLLA CITERA MIG OM NI VILL ATT JAG SKA HITTA TILLBAKS TILL TRÅDEN

Trädvy Permalänk
Medlem
Plats
Lund
Registrerad
Jan 2014

Du måste definiera metoden först,

def to_html(names): html_string = '' for person in names.split('\n'): person_name = person.split(',') html_string += """<tr onmouseover="this.style.backgroundColor='#ffff66';" onmouseout="this.style.backgroundColor='#d4e3e5';">""" html_string += '\n' + '<td>%s</td><td><b>%s</b></td>\n' % (person_name[0], person_name[1]) return html_string

Skapa en fil, till exempel "my_script.py". Börja med att klistra in definitionen ovan. Sedan under definitionen kan du skriva hur du vill använda metoden, ie:

def to_html(names): html_string = '' for person in names.split('\n'): person_name = person.split(',') html_string += """<tr onmouseover="this.style.backgroundColor='#ffff66';" onmouseout="this.style.backgroundColor='#d4e3e5';">""" html_string += '\n' + '<td>%s</td><td><b>%s</b></td>\n' % (person_name[0], person_name[1]) return html_string text = 'Kalle,Anka\nKajsa,Anka' html = to_html(text) print(html)

sedan i terminalen skriver du "python my_script.py".

Du kan även skriva det direkt i din python interpreter som du startar genom att skriva endast "python" i terminalen.

Det finns även python interpreters online, till exempel http://mathcs.holycross.edu/~kwalsh/python/

Dold text

Har ändrat i koden så att du kan köra den i både python 2 och python 3.

i7-7800x | ASUS Strix GTX 1080 | 64 GB RAM (for datascience stuff)

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Feb 2005

@devhdc:

En möjlig lösning i PowerShell.
Denna specifika varianten kräver dock att det är en UTF-8.

Paketerad fil med Serier.[CSV,PS1,html,PNG]
Bild med spektaklet

PS1

# Sökvägar $path = ".\Serier.csv" $expath = ".\Serier.html" # Tar bort filen där det ska sparas nya strängar. Remove-Item -Path $expath # Känd data $fixdata1 = "#ffff66"; $fixdata2 = "#d4e3e5"; # CSV UTF8 $SerieData = Import-Csv -Delimiter (",") -Encoding UTF8 -Path $path ForEach ($item in $SerieData) { #Definition av data från intressanta kolummner baserade på Header. Så döp översta raden till Col1 och Col2 $data1 = $item.(“Col1”) $data2 = $item.(“Col2”) # Sparar sträng i expath filen. Write-Output "<tr onmouseover=""this.style.backgroundColor='$fixdata1';""onmouseout=""this.style.backgroundColor='$fixdata2';""> <td>$data1</td><td><b>$data2</b></td> </tr>" >> $expath } # Visning i PS-fönstret vad som hänt. Write-Output $SerieData

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned

Problem med att få köra script?

Hoppas det löser din uppgift.

Ha det.

(Såg att du troligtvis inte använder Windows, men jaja kanske hjälper det någon annan.)

(Såg att du troligtvis inte använder Windows, men jaja kanske hjälper det någon annan.)

Just playing for fun ‾\o.0/‾

Trädvy Permalänk
Medlem
Plats
Kristinehamn
Registrerad
Maj 2002

@Tetratrio:
Jag fick ordning på det, hade deklarerat alla variabler innan också, men måste ha missat nånting som du sedan la in.. Oavsett, ser ut som filen jag ville konvertera till html använder mellanslag, inte komma..
ex:
Kalle Anka
Kajsa Anka
Knatte Anka

När jag provade med:
>>> text = 'Kajsa,anka super,stål'
>>> html = to_html(text)
>>> print(html)
Så fick jag:
<tr onmouseover="this.style.backgroundColor='#ffff66';" onmouseout="this.style.backgroundColor='#d4e3e5';">
<td>Kajsa</td><td><b>anka super</b></td>

Räcker det med att jag ändrar: person_name = person.split(',') till person_name = person.split(' ') ?

Och hur matar jag detta script med en extern fil? Säg att jag har en textfil med 40,000 entries som ska konverteras till html?

SNÄLLA CITERA MIG OM NI VILL ATT JAG SKA HITTA TILLBAKS TILL TRÅDEN

Trädvy Permalänk
Medlem
Plats
Kristinehamn
Registrerad
Maj 2002
Skrivet av Titane:

@devhdc:
(Såg att du troligtvis inte använder Windows, men jaja kanske hjälper det någon annan.)

Jo, jag använder Windows 10, men har Linux subsystems installerat, så jag har tillgång till bash direkt, men även via servrar, och eftersom jag aldrig satt mig in i powershell så blir det ofta att sh är en goto, men tack för tipsen

SNÄLLA CITERA MIG OM NI VILL ATT JAG SKA HITTA TILLBAKS TILL TRÅDEN

Trädvy Permalänk
Medlem
Plats
~/Karlstad
Registrerad
Dec 2005
Skrivet av devhdc:

@Tetratrio:
Jag fick ordning på det, hade deklarerat alla variabler innan också, men måste ha missat nånting som du sedan la in.. Oavsett, ser ut som filen jag ville konvertera till html använder mellanslag, inte komma..
ex:
Kalle Anka
Kajsa Anka
Knatte Anka

När jag provade med:
>>> text = 'Kajsa,anka super,stål'
>>> html = to_html(text)
>>> print(html)
Så fick jag:
<tr onmouseover="this.style.backgroundColor='#ffff66';" onmouseout="this.style.backgroundColor='#d4e3e5';">
<td>Kajsa</td><td><b>anka super</b></td>

Räcker det med att jag ändrar: person_name = person.split(',') till person_name = person.split(' ') ?

Och hur matar jag detta script med en extern fil? Säg att jag har en textfil med 40,000 entries som ska konverteras till html?

För att läsa en fil så kan du köra detta:

#min_fil.txt är filen som skall öppnas(i fallet nedan så ligger den i samma mapp som python-scriptet #När den är öppen så läser den rad för rad i for-loopen tills filen tar slut. #I denna loop kan du nu göra vad du vill med varje rad :) with open("min_fil.txt", "r") as f: for line in f: print(line.replace("\n",""))

I övrigt tror jag att du har fått svar på hur du ska göra för att lösa problemet(med python)

Bara gammalt skräp...

Trädvy Permalänk
Medlem
Plats
Lund
Registrerad
Jan 2014
Skrivet av devhdc:

Räcker det med att jag ändrar: person_name = person.split(',') till person_name = person.split(' ') ?

Och hur matar jag detta script med en extern fil? Säg att jag har en textfil med 40,000 entries som ska konverteras till html?

Det fungerar att istället köra

person.split(' ')

Hur man öppnar en fil och sedan sparar resultatet till en annan fil:

# Ändra till filen med alla namn names_filepath = 'namn.txt' # Detta är filen dit html-koden kommer skrivas html_filepath = 'output.html' html = '' with open(names_filepath, 'r') as fp: for line in fp: line = line.strip() if not line: continue html += """<tr onmouseover="this.style.backgroundColor='#ffff66';" onmouseout="this.style.backgroundColor='#d4e3e5';">""" name = line.split(' ') first_name = name[0] last_name = ' '.join(name[1:]) html += '\n<td>%s</td><td><b>%s</b></td>\n' % (first_name, last_name) with open(html_filepath, 'w') as fp: fp.write(html)

Har inte provkört koden men den borde fungera. Värt att nämna är att scriptet bör ligga i samma mapp som din fil, dock kan du alltid skriva '/path/to/namn.txt' eller liknande istället.

i7-7800x | ASUS Strix GTX 1080 | 64 GB RAM (for datascience stuff)

Trädvy Permalänk
Entusiast
Testpilot
Plats
Chalmers
Registrerad
Aug 2011

Oj, du bör nog slänga ut

onmouseover="this.style.backgroundColor='#ffff66';" onmouseout="this.style.backgroundColor='#d4e3e5';"

till förmån för CSS. Kanske något sådant:

tr { background-color: #d4e3e5; } tr:hover, tr:focus { background-color: #ffff66; }

Skrivet med hjälp av Better SweClockers