Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: opgelost [python] find en replace in csv alleen eerste kolom  (gelezen 2829 keer)

Offline _Walter_

  • Lid
opgelost [python] find en replace in csv alleen eerste kolom
« Gepost op: 2011/05/11, 22:30:08 »
Hoi,

Ik probeer de laatste tijd te programmeren in python. Ik heb er echter niet veel ervaring mee en aldoende ben ik aan het leren. Echter ik loop nu vast.

Ik heb een csv bestand met de volgende indeling:
nummer;naam;etc;nogeennummer;etc
1;aardappel;nogiets;23231;etc
2;appelflap;nogiets;23231;etc
3;siroop;nogiets;23231;etc

Nu wil ik van de eerste kolom die loopt van 1 t/m 96 de gegevens wijzigen naar het  volgende:
1 wordt A01
2 wordt B01
3 wordt C01
t/m 8 wordt H01
en dan:
9 wordt B02
10 wordt C02
t/m 16 wordt H02

En zo ook de rest van de kolom t/m 96 wordt H12

Nu kan ik wel tekst vervangen in het bestand, maar dan pakt hij ook een nummer van de vierde kolom.

Weten iemand een oplossing?

Groet,
Walter
« Laatst bewerkt op: 2011/05/13, 23:12:55 door _Walter_ »

Offline MKe

  • Lid
Re: python find en replace in csv alleen eerste kolom
« Reactie #1 Gepost op: 2011/05/12, 07:43:10 »
Ik doe dit heel veel.
Je kunt door de regels heen lopen, die splitsen op je delimiter en dan het eerste veld wijzigen.
Een voorbeeld:
file_in=file('input bestand','r') #input bestand
file_out=file('ouput bestand','w') #output bestand
for line in file_in:
    line=line.split(';') #regel opsplitsen. Het is nog wel handig om te controles in te bouwen om niet de verkeerde regels te wijzigen
    try: #error handling, krijg je geen problemen als er eens een witregel tussen zit (bij gebrek aan controle boven)
         line[0]='A01' #wijzig de waarde in de eerste kolom in A01
    except:
        pass
    line=';'.join(line) #weer aan elkaar zetten met ; als delimiter
    file_out.write(line) #schrijven naar het output bestand

Je moet het natuurlijk aanpassen aan je eigen situatie. Het kan nog iets compacter, maar ik denk dat het idee zo wel duidelijk is.
Dit werkt dus ook prima voor willekeurig welke andere kolom, je kunt dan voor kolom de regel line[1]='A01' gebruiken
« Laatst bewerkt op: 2011/05/12, 07:57:19 door MKe »
Mijn blokkendoos blog: http://mke21.wordpress.com/


Offline _Walter_

  • Lid
Re: python find en replace in csv alleen eerste kolom
« Reactie #3 Gepost op: 2011/05/13, 07:25:12 »
Bedankt voor de tips.

Desondanks krijg ik het nog niet voor elkaar, moeilijk vind ik het hoor.

Offline MKe

  • Lid
Re: python find en replace in csv alleen eerste kolom
« Reactie #4 Gepost op: 2011/05/13, 07:31:31 »
Bedankt voor de tips.

Desondanks krijg ik het nog niet voor elkaar, moeilijk vind ik het hoor.
Wat lukt niet? Als je mijn code test zou hij alle waarden in de eerste kolom moeten vervangen door A01. Hoef je alleen nog een functie te verzinnen om de getallen om te zetten in coordinaten.

Offline _Walter_

  • Lid
Re: python find en replace in csv alleen eerste kolom
« Reactie #5 Gepost op: 2011/05/13, 08:51:14 »
Soms moet je gewoon stoppen en dan later weer fris verder gaan.

Ineens weet ik weer hoe ik je code kan gebruiken.

file_in=file('bestand.csv','r') #input bestand
file_out=file('tijdelijk.csv','w') #output bestand
n = 0
for line in file_in:
    line=line.split(';') #regel opsplitsen. Het is nog wel handig om te controles in te bouwen om niet de verkeerde regels te wijzigen    line[0] = n
    if n == 0:
        line[0] = 'kolomkop'
    else: line[0] = str(n)
    line=';'.join(line) #weer aan elkaar zetten met ; als delimiter
    file_out.write(line) #schrijven naar het output bestand
    n = n + 1
file_out.close()

Nu telt hij van 1 tot 96 en staat er een header boven.

Harstikke bedankt!
« Laatst bewerkt op: 2011/05/13, 23:12:20 door _Walter_ »

Offline _Walter_

  • Lid
Re: opgelost [python] find en replace in csv alleen eerste kolom
« Reactie #6 Gepost op: 2011/05/20, 21:21:21 »
Dit is het geworden. Bedankt!!!!! Hij veranderd nu 1,97,385 etc naar A01 en 2,98 etc naar B01 etcetera.

        for csv in bestand:
            file_in=file(csv,'r') #input bestand
            file_out=file('tijdelijk.csv','w') #output bestand
            for line in file_in:
                line=line.split(';')
                if n == 0:
                    line[0] = 'BRON'
                else:
                    for i in range (0,13):
                        if line[0] == '"'+str(1+96*i)+'"':
                            line[0] = 'A01'
                        elif line[0] == '"'+str(2+96*i)+'"':
                            line[0] = 'B01'
                        elif line[0] == '"'+str(3+96*i)+'"':
                            line[0] = 'C01'
                        elif line[0] == '"'+str(4+96*i)+'"':
                            line[0] = 'D01'
                        elif line[0] == '"'+str(5+96*i)+'"':
                            line[0] = 'E01'
                        elif line[0] == '"'+str(6+96*i)+'"':
                            line[0] = 'F01'
                        elif line[0] == '"'+str(7+96*i)+'"':
                            line[0] = 'G01'
                        elif line[0] == '"'+str(8+96*i)+'"':
                            line[0] = 'H01'
                        elif line[0] == '"'+str(9+96*i)+'"':
                            line[0] = 'A02'
                        elif line[0] == '"'+str(10+96*i)+'"':
                            line[0] = 'B02'
                        elif line[0] == '"'+str(11+96*i)+'"':
                            line[0] = 'C02'
                        elif line[0] == '"'+str(12+96*i)+'"':
                            line[0] = 'D02'
                        elif line[0] == '"'+str(13+96*i)+'"':
                            line[0] = 'E02'
                        elif line[0] == '"'+str(14+96*i)+'"':
                            line[0] = 'F02'
                        elif line[0] == '"'+str(15+96*i)+'"':
                            line[0] = 'G02'
                        elif line[0] == '"'+str(16+96*i)+'"':
                            line[0] = 'H02'
                        elif line[0] == '"'+str(17+96*i)+'"':
                            line[0] = 'A03'
                        elif line[0] == '"'+str(18+96*i)+'"':
                            line[0] = 'B03'
                        elif line[0] == '"'+str(19+96*i)+'"':
                            line[0] = 'C03'
                        elif line[0] == '"'+str(20+96*i)+'"':
                            line[0] = 'D03'
                        elif line[0] == '"'+str(21+96*i)+'"':
                            line[0] = 'E03'
                        elif line[0] == '"'+str(22+96*i)+'"':
                            line[0] = 'F03'
                        elif line[0] == '"'+str(23+96*i)+'"':
                            line[0] = 'G03'
                        elif line[0] == '"'+str(24+96*i)+'"':
                            line[0] = 'H03'
                        elif line[0] == '"'+str(25+96*i)+'"':
                            line[0] = 'A04'
                        elif line[0] == '"'+str(26+96*i)+'"':
                            line[0] = 'B04'
                        elif line[0] == '"'+str(27+96*i)+'"':
                            line[0] = 'C04'
                        elif line[0] == '"'+str(28+96*i)+'"':
                            line[0] = 'D04'
                        elif line[0] == '"'+str(29+96*i)+'"':
                            line[0] = 'E04'
                        elif line[0] == '"'+str(30+96*i)+'"':
                            line[0] = 'F04'
                        elif line[0] == '"'+str(31+96*i)+'"':
                            line[0] = 'G04'
                        elif line[0] == '"'+str(32+96*i)+'"':
                            line[0] = 'H04'
                        elif line[0] == '"'+str(33+96*i)+'"':
                            line[0] = 'A05'
                        elif line[0] == '"'+str(34+96*i)+'"':
                            line[0] = 'B05'
                        elif line[0] == '"'+str(35+96*i)+'"':
                            line[0] = 'C05'
                        elif line[0] == '"'+str(36+96*i)+'"':
                            line[0] = 'D05'
                        elif line[0] == '"'+str(37+96*i)+'"':
                            line[0] = 'E05'
                        elif line[0] == '"'+str(38+96*i)+'"':
                            line[0] = 'F05'
                        elif line[0] == '"'+str(39+96*i)+'"':
                            line[0] = 'G05'
                        elif line[0] == '"'+str(40+96*i)+'"':
                            line[0] = 'H05'
                        elif line[0] == '"'+str(41+96*i)+'"':
                            line[0] = 'A06'
                        elif line[0] == '"'+str(42+96*i)+'"':
                            line[0] = 'B06'
                        elif line[0] == '"'+str(43+96*i)+'"':
                            line[0] = 'C06'
                        elif line[0] == '"'+str(44+96*i)+'"':
                            line[0] = 'D06'
                        elif line[0] == '"'+str(45+96*i)+'"':
                            line[0] = 'E06'
                        elif line[0] == '"'+str(46+96*i)+'"':
                            line[0] = 'F06'
                        elif line[0] == '"'+str(47+96*i)+'"':
                            line[0] = 'G06'
                        elif line[0] == '"'+str(48+96*i)+'"':
                            line[0] = 'H06'
                        elif line[0] == '"'+str(49+96*i)+'"':
                            line[0] = 'A07'
                        elif line[0] == '"'+str(50+96*i)+'"':
                            line[0] = 'B07'
                        elif line[0] == '"'+str(51+96*i)+'"':
                            line[0] = 'C07'
                        elif line[0] == '"'+str(52+96*i)+'"':
                            line[0] = 'D07'
                        elif line[0] == '"'+str(53+96*i)+'"':
                            line[0] = 'E07'
                        elif line[0] == '"'+str(54+96*i)+'"':
                            line[0] = 'F07'
                        elif line[0] == '"'+str(55+96*i)+'"':
                            line[0] = 'G07'
                        elif line[0] == '"'+str(56+96*i)+'"':
                            line[0] = 'H07'
                        elif line[0] == '"'+str(57+96*i)+'"':
                            line[0] = 'A08'
                        elif line[0] == '"'+str(58+96*i)+'"':
                            line[0] = 'B08'
                        elif line[0] == '"'+str(59+96*i)+'"':
                            line[0] = 'C08'
                        elif line[0] == '"'+str(60+96*i)+'"':
                            line[0] = 'D08'
                        elif line[0] == '"'+str(61+96*i)+'"':
                            line[0] = 'E08'
                        elif line[0] == '"'+str(62+96*i)+'"':
                            line[0] = 'F08'
                        elif line[0] == '"'+str(63+96*i)+'"':
                            line[0] = 'G08'
                        elif line[0] == '"'+str(64+96*i)+'"':
                            line[0] = 'H08'
                        elif line[0] == '"'+str(65+96*i)+'"':
                            line[0] = 'A09'
                        elif line[0] == '"'+str(66+96*i)+'"':
                            line[0] = 'B09'
                        elif line[0] == '"'+str(67+96*i)+'"':
                            line[0] = 'C09'
                        elif line[0] == '"'+str(68+96*i)+'"':
                            line[0] = 'D09'
                        elif line[0] == '"'+str(69+96*i)+'"':
                            line[0] = 'E09'
                        elif line[0] == '"'+str(70+96*i)+'"':
                            line[0] = 'F09'
                        elif line[0] == '"'+str(71+96*i)+'"':
                            line[0] = 'G09'
                        elif line[0] == '"'+str(72+96*i)+'"':
                            line[0] = 'H09'
                        elif line[0] == '"'+str(73+96*i)+'"':
                            line[0] = 'A10'
                        elif line[0] == '"'+str(74+96*i)+'"':
                            line[0] = 'B10'
                        elif line[0] == '"'+str(75+96*i)+'"':
                            line[0] = 'C10'
                        elif line[0] == '"'+str(76+96*i)+'"':
                            line[0] = 'D10'
                        elif line[0] == '"'+str(77+96*i)+'"':
                            line[0] = 'E10'
                        elif line[0] == '"'+str(78+96*i)+'"':
                            line[0] = 'F10'
                        elif line[0] == '"'+str(79+96*i)+'"':
                            line[0] = 'G10'
                        elif line[0] == '"'+str(80+96*i)+'"':
                            line[0] = 'H10'
                        elif line[0] == '"'+str(81+96*i)+'"':
                            line[0] = 'A11'
                        elif line[0] == '"'+str(82+96*i)+'"':
                            line[0] = 'B11'
                        elif line[0] == '"'+str(83+96*i)+'"':
                            line[0] = 'C11'
                        elif line[0] == '"'+str(84+96*i)+'"':
                            line[0] = 'D11'
                        elif line[0] == '"'+str(85+96*i)+'"':
                            line[0] = 'E11'
                        elif line[0] == '"'+str(86+96*i)+'"':
                            line[0] = 'F11'
                        elif line[0] == '"'+str(87+96*i)+'"':
                            line[0] = 'G11'
                        elif line[0] == '"'+str(88+96*i)+'"':
                            line[0] = 'H11'
                        elif line[0] == '"'+str(89+96*i)+'"':
                            line[0] = 'A12'
                        elif line[0] == '"'+str(90+96*i)+'"':
                            line[0] = 'B12'
                        elif line[0] == '"'+str(91+96*i)+'"':
                            line[0] = 'C12'
                        elif line[0] == '"'+str(92+96*i)+'"':
                            line[0] = 'D12'
                        elif line[0] == '"'+str(93+96*i)+'"':
                            line[0] = 'E12'
                        elif line[0] == '"'+str(94+96*i)+'"':
                            line[0] = 'F12'
                        elif line[0] == '"'+str(95+96*i)+'"':
                            line[0] = 'G12'
                        elif line[0] == '"'+str(96+96*i)+'"':
                            line[0] = 'H12'
                line=';'.join(line) #weer aan elkaar zetten met ; als delimiter
                file_out.write(line) #schrijven naar het output bestand
                n = n+1
        file_out.close()
        file_in.close()
        shutil.copy('tijdelijk.csv',csv)
        os.remove('tijdelijk.csv')

Re: opgelost [python] find en replace in csv alleen eerste kolom
« Reactie #7 Gepost op: 2011/05/21, 10:23:01 »
Ik zou nog eens goed nadenken over die ongelofelijk grote if/elif blok. Het doet nogal pijn aan de ogen :).
Er kan nog veel verbeterd worden met een lus. Ge maakt telkens dezelfde berekening, namelijk n+96*i waar n een oplopend getal is. Dus maak daar een lus van:
for x in xrange(1, 96):
    if line[0] == '"'+str(x+96*i)+'"':
        ...

Ook het toewijzen van een waarde is telkens hetzelfde, namelijk A01...A12, H01...H12 , misschien iets moeilijker om het in de bovenstaande lus in te werken, maar zeker doenbaar.

Offline _Walter_

  • Lid
Re: opgelost [python] find en replace in csv alleen eerste kolom
« Reactie #8 Gepost op: 2011/05/21, 10:38:08 »
Mee eens dat het een lullig if blok is. In eerste instantie deed ik het ook niet goed. Toen had ik een for x in range van 1 tot 12. en dan 'A'+x en daarna het zelfde voor B. Alleen..... Het is niet A1,A2,A3, maar het moest worden A01,B01,C01 etc..... en toen wist ik het niet meer te 'herleiden' , vandaar.

groet,
Walter

Offline MKe

  • Lid
Re: opgelost [python] find en replace in csv alleen eerste kolom
« Reactie #9 Gepost op: 2011/05/21, 21:10:34 »
Hoi Walter,

Dat if/else block is idd geen goed idee. Is ook niet uit te breiden. Ee n formule is veel beter.
Ik heb dit ook veel gedaan voor microtiter platen. Deze hebben een 96-wells grid en eenzelfde coordinaten stelsel.
Voor 96 wells heb ik de volgende functie gemaakt:
def omreken(pos):
    rel_pos=pos-(int((pos-1)/96)*96) #Voorgaande platen eraf trekken voor positie in plaat
    col=int((rel_pos-1)/8)+1 #bereken kolom nummer
    row=rel_pos-((col-1)*8) #bereken rij nummer
    row_letter=chr(64+row) #zet rijnummer om naar letter
    return row_letter+str(col).zfill(2)
Als je dus omreken(1) doet, geeft hij A01 enz. t/m 96=H12. Als je dan 97 doet begint hij weer bij A01
Je kunt tot in het oneindige doorgaan, dus veel meer dan 2 platen. Ik hoop dat je er wat aan hebt.
« Laatst bewerkt op: 2011/05/21, 21:12:10 door MKe »
Mijn blokkendoos blog: http://mke21.wordpress.com/

Offline _Walter_

  • Lid
Re: opgelost [python] find en replace in csv alleen eerste kolom
« Reactie #10 Gepost op: 2011/05/22, 20:27:43 »
Hoi MKe,

Wat geweldig zeg:

>>> print omreken(1)
A01
>>> print omreken(4565436453)
E09
>>> print omreken (9124192849898324341234)
B11
>>>

Knap gedaan zeg! Daar kan ik zeker wat mee. Het gaat in mijn geval niet geheel toevallig ook om microtiterplaten, maar dat terzijde.

Groet,
Walter

Offline MKe

  • Lid
Re: opgelost [python] find en replace in csv alleen eerste kolom
« Reactie #11 Gepost op: 2011/05/22, 20:46:25 »
Het gaat in mijn geval niet geheel toevallig ook om microtiterplaten, maar dat terzijde.
:D zoiets dacht ik al. Het was te bekend. Maar graag gedaan hoor.  O0