Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Python: Tekstitiedoston rivit sarakkeiksi

Jumpppi [01.06.2017 18:54:05]

#

Eli teksti/numerot pitäisi saada käännettyä pystysuorista riveistä vaakasuoriin riveihin niin että joka kirjaimen/numeron välissä on(,) merkki. Esim: A.txt tiedostossa lukee rivit:

Sssssssss.       Rrrrrrtt

121212121       13344334
333121212       1162627S
212SSSSS2       23444SSS
SS1345725       2727255S
1338388SS       24828SSS
133777222       23SS2827
222725155       216SS161

Ja nämä pystysuorat rivit pitäisi saada B.txt tiedostoon muodossa:

1,3,2,s,1,1,2
2,3,1,s,3,3,2
......

Jos pystysuorassa rivissä on kirjain, se pitäisi saada vaakasuoraan riveihin pienenä kirjaimena. Sssssssss ja Rrrrrrr otsikoita ei B.txt tarvisi huomioida mitenkään, kaikki rivit saisi tulostua yhtenä pötkönä vaakasuorassa. Ja mahdollisesti B.txt tiedosto on jo olemassa ja jossa ensimmäiset 5riviä saisi pysyä ennallaan ja nämä vaakarivit tulisi vaan niiden jatkoksi.

Chiman [01.06.2017 22:55:04]

#

Testaamatta, jyräten aiemman B:n:

with open('A.txt') as f:
    rivit = f.readlines()

with open('B.txt', 'w') as f:
    for sarake in zip(*rivit[2:]):
        f.write(','.join(sarake).lower() + '\n')

Silmukan sisäisellä if-lauseella voi karsia mahdolliset turhat sarakkeet.

Jumpppi [02.06.2017 09:18:15]

#

Chiman kirjoitti:

Testaamatta, jyräten aiemman B:n:

with open('A.txt') as f:
    rivit = f.readlines()

with open('B.txt', 'w') as f:
    for sarake in zip(*rivit[2:]):
        f.write(','.join(sarake).lower() + '\n')

Silmukan sisäisellä if-lauseella voi karsia mahdolliset turhat sarakkeet.

Näyttäisi toimivan hyvin pitkälti niinkuin pitikin nuilla esimerkeillä, ainut vaan että minun pikaisesti tehty esimerkki(A.txt) ei ollu oikein :(

Siinä onkin välilyönnit pystysuorien rivien välissä ja joka kolmannen merkin jälkeen ylhäältä alas on myös välilyönti, paitsi viimeisessä sarakkeessa neljä merkkiä.

Tässä se täsmälleen oikealta näyttävä A.txt kaikkine välilyönteineen ja jakoineen. Lista saattaa jatkua tuonne alaspäin tällä tyylillä/jaolla hyvinkin pitkästi. Kaikki kuitenkin pitäisi saada pinoon vaakasuoraan.

SSSSSSSSSS                 RRRRRRRRRR
1 2 1 2 1   2 1 2 1 2      1 3 3 4 4   3 3 4 6 9
3 3 3 1 2   1 2 1 2 2      1 1 6 2 6   2 7 S 4 8
2 1 2 S S   S S S 2 5      2 3 4 4 4   S S S 3 7

S S 1 3 4   5 7 2 5 G      2 7 2 7 2   5 5 S 3 5
1 3 3 8 3   8 8 S S 3      2 4 8 2 8   S S S 2 5
1 3 3 7 7   7 2 2 2 G      2 3 S S 2   8 2 7 2 5

2 2 2 7 2   5 1 5 5 2      2 1 6 S S   1 6 1 7 5
4 4 5 6 5   6 6 3 1 2      5 2 6 4 6   8 6 6 7 5
4 7 8 9 6   6 3 2 4 4      5 6 6 5 9   6 9 9 8 5

4 S S 2 V   2 V V V 4      V 6 6 8 9   0 0 0 9 6
4 7 9 9 9   8 X X C 4      H 9 0 J 8   H 7 6 0 6
4 S S 2 V   2 V V V V      6 6 8 9 0   0 0 4 9 5
1 3 3 8 3   8 8 S S 2      4 8 2 8 S   S S 4 0 5

TTTTTTTTTT                 UUUUUUUUUU
6 2 1 2 1   2 1 2 1 2      A 3 3 4 4   3 3 4 6 9
3 2 3 1 2   1 2 1 2 2      E 1 6 2 6   2 7 S 4 8
2 1 2 S S   S S S 2 5      2 3 4 4 4   S S S 3 7

S S 5 3 4   5 7 2 5 G      1 7 2 7 2   5 5 S 3 5
2 3 3 8 3   8 8 S S 3      1 4 8 2 8   S S S 2 5
1 3 5 7 7   7 2 1 2 G      1 3 S S 2   8 2 7 2 5

9 2 2 7 2   5 1 4 5 2      2 1 6 S S   1 6 1 7 5
4 4 5 6 5   6 6 3 1 2      5 2 6 4 6   8 6 6 7 5
6 7 1 9 6   6 3 2 4 4      5 6 6 5 9   8 9 9 8 5

4 S S 2 V   2 V V V 4      V 6 6 8 9   0 0 0 9 6
4 7 9 9 9   8 X X C 4      H 9 0 J 8   H 7 6 0 6
4 S S 2 V   2 V V V V      6 6 8 9 0   0 0 4 9 5
1 3 3 8 3   8 8 S S 2      4 8 2 8 S   S S 4 0 5

B.Txt tulostuu kyllä juuri niinkuin pitää, paitsi että Sssssss ja Rrrrrr välissä oleva väli tulee täyteen pilkkuja kun sen pitäisi jatkua yhtenäisenä.

1,2,2,5,s,2,5,1,4,v,c,v,s
2,2,5,g,3,g,2,2,4,4,4,v,2
 , , , , , ,
 , , , , , ,
 , , , , , ,
 , , , , , ,
 , , , , , ,
 , , , , , ,
 , , , , , ,
1,1,2,2,2,2,2,5,5,v,h,6,4
3,1,3,7,4,3,1,2,6,6,9,6,8

Pitäisi tulla näin:

1,2,2,5,s,2,5,1,4,v,c,v,s
2,2,5,g,3,g,2,2,4,4,4,v,2
1,1,2,2,2,2,2,5,5,v,h,6,4
3,1,3,7,4,3,1,2,6,6,9,6,8

Kiitos!

Chiman [03.06.2017 16:50:46]

#

#!/usr/bin/env/python3

def kohderivit(rivit_it):
    for rivi in rivit_it:
        if len(rivi.split()) >= 20:
            yield rivi

def kohdesarakkeet(sarakkeet_it):
    for sarake in sarakkeet_it:
        if any(c.isalnum() for c in sarake):
            yield sarake

with open('A.txt') as fi, open('B.txt', 'w') as fo:
    ryhma = []
    for rivi in kohderivit(fi):
        ryhma.append(rivi.lower())
        if len(ryhma) < 13:
            continue
        for sarake in kohdesarakkeet(zip(*ryhma)):
            fo.write(','.join(sarake) + '\n')
        ryhma = []

Ehkä toimii, ehkä ei. B.txt-alun säilytys jää kotitehtäväksi.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta