Millä tekniikalla tai kielellä olisi mukavinta pistää pilkku jokaiselle riville ennen numeroa?
Tässä esimerkki monta sataa riviä pitkästä tiedostosta.
Tamrmen, E. 49.
Tuominen, F. A. 177.
Tuominen, I. S. 6.
Tuominen, D. 79.
Pilkku pitäisi siis saada esimerkiksi: Tuominen, D. ,79.
Tässä esimerkki monta sataa riviä pitkästä tiedostosta.
Tamrmen, E. 49.
Tuominen, F. A. 177.
Tuominen, I. S. 6.
Tuominen, D. 79.
Pilkku pitäisi siis saada esimerkiksi: Tuominen, D. ,79.
Vastaukset 20
Vanhimmat
esim. pythonilla jotenkin näin
- - - - - - - - - - - -
a = "Tuominen, F. A. 177."
b = '123456789'
i=-1;
for c in b:
d=a.find(c)
if d != -1 and (i == -1 or d < i):
i = d
if i != -1:
c = a[:i] ',' a[i:]
print (a)
print (c)
- - - - - - - - - - -
tulostaa:
Tuominen, F. A. 177.
Tuominen, F. A. ,177.
Lisäksi vain tiedostosta luku ja talletus rivi riviltä
Jahas tabulaattorit ei näemmä näy
a = "Tuominen, F. A. 177."
b = '123456789'
i=-1;
for c in b:
d=a.find(c)
if d != -1 and (i == -1 or d < i):
i = d
if i != -1:
c = a[:i] ',' a[i:]
print (a)
print (c)
Ei näemmä välilyönnitkään, no entä näin?
a = "Tuominen, F. A. 177."
b = '123456789'
i=-1;
for c in b:
d=a.find(c)
if d != -1 and (i == -1 or d < i):
i = d
if i != -1:
c = a[:i] ',' a[i:]
print (a)
print (c)
Jotain tällaista kun tiedoston luku ja kirjoitus on mukana
- - - - - - - -
nrot = '123456789'
t1 = open ("lukutiedosto.txt","r")
sisalto = t1.readlines()
t1.close()
t1 = open ("kirjoitustiedosto.txt","w")
for a in sisalto:
i=-1;
for c in nrot:
d = a.find(c)
if d != -1 and (i == -1 or d < i):
i = d
if i != -1:
c = a[:i] ',' a[i:]
t1.write(c)
t1.close()
jos jollakin rivillä ei olekaan numeroita, niin siltävaralta tuossa lopussa voisi olla
if i != -1:
c = a[:i] ',' a[i:]
t1.write(c)
else:
t1.write(a)
sed -i 's/ \([0-9]\)/, \1/g'
Nojoo.. laitetaan sitten lyhyeksi.
- - - - -
import re
t1 = open ("lukutiedosto.txt","r")
t2 = open ("kirjoitustiedosto.txt","w")
t2.write(re.sub('(?
pythonilla saat tuon kaiken kahdelle riville (eka rivi on edelleen import re), kun heität turhat openit ja closet pois. silti se venyy kymmeniä merkkejä sediä pidemmäksi.
Ohjelma kannattaa tehdä Brainfuckilla jotta siinä ei tarvita noinjärjwttömän montaa erilaista merkkiä kuin pythonilla. Oikeat ammattilaiset tekevät sitten Whitespacella jolloin tarvittavien merkkien määrä laskee vielä vähäisemmäksi. Vähemmän = aina helpompaa.
Toki saa
open("kirjoitustiedosto.txt","w").write(re.sub('(?
...johon pitää saada pilkut paikalleen, laittasin ne ennemmin muutamassa sekunnissa epäselvällä skriptillä kuin viilailisin turhaan selkeetä, uudelleenkäytettävää, laajennettavaa, standardin mukaista, tehokasta, tietoturvallista tai jotenkin muuten turhaa ratkaisua.
alkuperäinen kysymys: "Millä tekniikalla tai kielellä olisi mukavinta pistää pilkku jokaiselle riville ennen numeroa?", oikea vastaus: sedillä.
Uudelleenkäytettävyys ja ennenkaikkea laajennettavuus ei ole turhaa. Tuskin elämässäsi vain yhden ainoan kerran tiedostoa muokkaat. Ja silloin selkeyskin eduksi koska uudelleenkäyttö helpompaa.
Sitäpaitsi sed vastauksesi ei toteuta tehtävää täsmällisesti "pilkku jokaiselle riville ennen numeroa". Vastauksessasi pilkkua ei lisätä jos numeron edessä ei ole välilyöntiä, ja pilkku ei tule ennen numeroa, vaan ennen välilyöntiä.
"Uudelleenkäytettävyys ja ennenkaikkea laajennettavuus ei ole turhaa"
joskus on, joskus ei. jotkut sen tietää, jotkut taas ei.
"Tuskin elämässäsi vain yhden ainoan kerran tiedostoa muokkaat."
jotkut hommat pitää tehdä vaan kerran. joskus taas skriptan kirjoittaa nopeammin tyhjästä uudelleen kuin etsii sen uudelleenkäytettävän ja ennenkaikkea laajennettavan toteutuksen muiden turhien skriptien joukosta.
mieti ny: mun sed-komento on lyhyempi kuin sun laajennettavan python-skriptisi hakemistopolku tiedostonimi. eli eiköhän sen uudelleenkäytön voi ihan varmasti unohtaa kokonaan. ja vinkki: jos oikeesti pidät uudelleenkäytettävyyttä arvossa, kannattaa siirtyä muuttujanimistä a, b, c, d vähän kuvaavampiin.
"Sitäpaitsi sed vastauksesi ei toteuta tehtävää täsmällisesti "pilkku jokaiselle riville ennen numeroa". "
ja sun toteuttaa? otas rivi "a, b 0 1 23". tolla rivillä on neljä numeroa kolmessa eri luvussa. täsmällisesti luettuna tehtävän anto ei kerro, mitä numeroa ennen pilkku halutaan. aika hyviä arvauksia vois olla ensimmäinen, viimeinen tai kaikki numerot. sun find-toteutuksesi laittaa pilkun ennen tän rivin toista numeroa, ja sun regexpisi laittaa sen ennen ekaa, tokaa ja neljättä numeroa, mutta ei kuitenkaan ennen numeroa 3. kumpikaan sun toteutuksesi ei siis toteuta yhtäkään kolmesta aika hyvästä arvauksesta täsmälliseksi tulkinnaksi.
tehtävänanto kuvaa erittäin harvoin täsmällisesti sen, mitä oikeesti halutaan. usein ei edes tiedetä mitä täsmälleen halutaan. siksi pitää itse tulkita mitä ehkä saatettaisiin haluta. sun tulkintasi find-toteutuksessa näyttää olleen "ennen rivin ensimmäistä numeroa joka voi olla myös keskellä sanaa" ja regexp-toteutuksessa "ennen jokaista kokonaislukua". nää tulkinnat on niin kaukana toisistaan, että on vähän yllättävää, että kuitenkin huomautat tehtävän täsmällisestä tulkinnasta.
omassa tulkinnassani halusin noudattaa sitä oikeinkirjoitussääntöä, joka laittaa pilkun jälkeen aina välilyönnin. jos menee väärin, voi kirjoittaa paljon nopeammin uuden sed-komennon kuin koittaa muokata uudelleenkäytettävää ja laajennettavaa python-viritystä. see what i mean?
Hyvin sanottu.
Ei kannata tehdä yleiskäyttöistä tauhkaa jos asia on yksinkertainen ja luultavasti kertaluonteinen.
Joku tekisi vielä kaiken siirrettävästi ilman erillistä vaatimusta. Sekin voi onnistua tai sitten ei.
Turhiin asioihin ei kannata panostaa.
Tehkää ensin sedillä niin pilkku tulee väärin, ja tehkää se sitten oikein pythonilla.
Pythonilla teet sen uudelleenkäytettäväksi ja muokattavaksi.
Turhaan.
Ja aikaa palaa.
Mitä toi '-i' tossa tekee, ei toimi. Ja tiedostotkin pitäisi olla eli näin:
sed 's/ \([0-9]\)/ ,\1/g' new.txt
Siis näin ('kulmasulut' häviää palstalla):
sed 's/ \([0-9]\)/ ,\1/g' < old.txt > new.txt
Siis näin?
sed 's/ \([0-9]\)/ ,\1/g' new.txt
Noi kulmasulut ym voi korvata html entiteeleillä ja korvaaminen windowsissa käy kätevästi esimerkiksi seuraavanlaisella python pätkällä. Ohjelma siis käsittelee leikepöydän sisällön. Tarvitaan vain lisäksi http://sourceforge.net/projects/pywin32/ joka sisältää tuon win32clipboard moduulin
import win32clipboard as w
import win32con
def getText():
w.OpenClipboard()
d=w.GetClipboardData(win32con.CF_UNICODETEXT)
w.CloseClipboard()
return d
def setText(aString):
w.OpenClipboard()
w.EmptyClipboard()
w.SetClipboardData(win32con.CF_UNICODETEXT,aString)
w.CloseClipboard()
t = getText()
t = t.replace("&","&")
t = t.replace("
kysy vaikka "man sed" ja näppäile sitten "/", "-i", enter ja paina vielä "n". et tarvitse kulmasulkeita, tiedostonimi riittää.