TsvGis
TsvGis

Reputation: 632

Python filtering text

Hi have this text file that groups information in between the characters "*******************************" eg:

*******************************
15674B  2000
#12 DIVERSION
           800.000
COORDINATES
    0
FLOW DIRECTION
    0      
PROTECT DATA
    0      
DATUM
      0.00
RADIUS TYPE
    2
DIVIDE X-Section
0
SECTION ID

INTERPOLATED
    0
ANGLE
    0.00   0
RESISTANCE NUMBERS
   0  0     1.000     1.000     1.000    1.000    1.000
PROFILE        8
   -15.000    12.000     1.000     <#0>     0     0.000     0
     0.000    10.960     1.000     <#1>     0     0.000     0
     0.600    10.820     1.000     <#0>     0     0.000     0
     0.700    10.410     1.000     <#0>     0     0.000     0
     1.540     9.990     1.000     <#0>     0     0.000     0
     4.040     9.980     1.000     <#2>     0     0.000     0
     6.200    11.160     1.000     <#4>     0     0.000     0
    15.000    12.000     1.000     <#0>     0     0.000     0
LEVEL PARAMS
   0  0    0.000  0    0.000  20
*******************************
15674B  2000
#12 DIVERSION
           900.000

What I am trying to do is extract the second and third line (#12 DIVERSION, 800.00) underneath the characters "*******************************" as well as the PROFILE information on lines 24 -32, and save them to a csv file.

I know that I can use python to read the file eg:

with open ("results.txt","r") as myResults:
    readFile = myResults.readlines()

but my issues is I don't know how identify groups of information between characters "*******************************" and then extract certain lines out.

Any assistance would be greatly appreciated.

Upvotes: 1

Views: 91

Answers (2)

jorgeh
jorgeh

Reputation: 1767

If the file is not too long (i.e. you can read the whole file into memory), you can try something like this:

with open("results.txt","r") as myResults:
    blocks = myResults.read() # put the whole file into a string

# split the string into blocks and process them independently
for block in blocks.split('*******************************')[1:]:
    lines = block.split('\n')
    print lines[1]
    print lines[2]
    for i in range(24, 33):
        print lines[i]

Upvotes: 1

Ilya Peterov
Ilya Peterov

Reputation: 2065

This will probably work:

lines_you_want = []

with open ("test.txt","r") as myResults:
    lines = myResults.readlines()
    indexes_of_lines_you_want = [] # We create a list for the indexes of the lines you want to extract

    for i in range(len(lines)):
        if '*******' in lines[i]: # We check if the current line is a line full of stars
            indexes_of_lines_you_want.extend([i+2, i+3]) # We add the indexes current_index+2 and current_index+3 to our list

    for i in indexes_of_lines_you_want:
        lines_you_want.append(lines[i])

after that you can save the lines from the list lines_you_want to a .csv file like this

import csv

myfile = open('result.csv', 'w', newline='')
writer = csv.writer(myfile)
writer.writerow(lines_you_want)

though you should probably put import csv in the beginning.

Upvotes: 1

Related Questions