Parsing Text file

S

sas429s

I have a text file like this:

Sometext
Somemore
Somemore
maskit

Sometext
Somemore
Somemore
Somemore
maskit

Sometext
Somemore
maskit

I want to search for the string maskit in this file and also need to print Sometext above it..SOmetext location can vary as you can see above.

In the first instance it is 3 lines above mask it, in the second instance it is 4 lines above it and so on..

Please help how to do it?
 
N

Neil Cerutti

I have a text file like this:

Sometext
Somemore
Somemore
maskit

Sometext
Somemore
Somemore
Somemore
maskit

Sometext
Somemore
maskit

I want to search for the string maskit in this file and also
need to print Sometext above it..SOmetext location can vary as
you can see above.

In the first instance it is 3 lines above mask it, in the
second instance it is 4 lines above it and so on..

Please help how to do it?

How can you tell the difference between Sometext and Somemore?
 
S

sas429s

Somemore can be anything for instance:

Sometext
mail
maskit

Sometext
rupee
dollar
maskit

and so on..

Is there a way I can achieve this?
 
T

Tobiah

Somemore can be anything for instance:

Sometext
mail
maskit

Sometext
rupee
dollar
maskit

and so on..

Is there a way I can achieve this?

How do we know whether we have Sometext?
If it's really just a literal 'Sometext', then
just print that when you hit maskit.

Otherwise:


for line in open('file.txt').readlines():

if is_sometext(line):
memory = line

if line == 'maskit':
print memory
 
N

Neil Cerutti

How do we know whether we have Sometext?
If it's really just a literal 'Sometext', then
just print that when you hit maskit.

Otherwise:


for line in open('file.txt').readlines():

if is_sometext(line):
memory = line

if line == 'maskit':
print memory

Tobiah's solution fits what little we can make of your problem.

My feeling is that you've simplified your question a little too
much in hopes that it would help us provide a better solution.
Can you provide more context?
 
J

Joshua Landau

How do we know whether we have Sometext?
If it's really just a literal 'Sometext', then
just print that when you hit maskit.

Otherwise:


for line in open('file.txt').readlines():

if is_sometext(line):
memory = line

if line == 'maskit':
print memory

My understanding of the question follows more like:

# Python 3, UNTESTED

memory = []
for line in open('file.txt').readlines():
if line == 'maskit':
print(*memory, sep="")

elif line:
memory.append(line)

else:
memory = []
 
S

sas429s

Ok here is a snippet of the text file I have:

config/meal/governor_mode_config.h
#define GOVERNOR_MODE_TASK_RATE SSS_TID_0015MSEC
#define GOVERNOR_MODE_WORK_MODE_MASK (CEAL_MODE_WORK_MASK_GEAR| \
CEAL_MODE_WORK_MASK_PARK_BRAKE | \
CEAL_MODE_WORK_MASK_VEHICLE_SPEED)
#define GOVERNOR_MODE_IDLE_CHECK FALSE
#define GOVERNOR_MODE_SPD_THRES 50
#define GOVERNOR_MODE_SPDDES_THRES 10

config/meal/components/source/kso_aic_core_config.h
#define CEAL_KSO_AIC_CORE_TASK_RATE SSS_TID_0120MSEC
#define CEAL_KSO_AIC_LOAD_FAC_AVG_TIME 300
#define CEAL_KSO_AIC_LOAD_FAC_HYST_TIME 30
#define CEAL_KSO_AIC_TEMP_DPF_INSTALLED TRUE
#define CEAL_KSO_AIC_TEMP_DPF_ENABLE 450
#define CEAL_KSO_AIC_TEMP_DPF_HYST 25
#define CEAL_KSO_AIC_DPF_ROC_TIME 10
#define CEAL_KSO_AIC_TEMP_EXHAUST_INSTALLED FALSE
#define CEAL_KSO_AIC_TEMP_EXHAUST_ENABLE 275
#define CEAL_KSO_AIC_TEMP_EXHAUST_HYST 25
#define CEAL_KSO_AIC_EXHAUST_ROC_TIME 10
#define CEAL_KSO_AIC_WORK_MODE_MASK (CEAL_MODE_WORK_MASK_GEAR | \
CEAL_MODE_WORK_MASK_PARK_BRAKE | \
CEAL_MODE_WORK_MASK_VEHICLE_SPEED)
#define CEAL_KSO_AIC_OV_TIME 15

Here I am looking for the line that contains: "WORK_MODE_MASK", I want to print that line as well as the file name above it: config/meal/governor_mode_config.h
or config/meal/components/source/ceal_PackD_kso_aic_core_config.h.

SO the output should be something like this:
config/meal/governor_mode_config.h

#define GOVERNOR_MODE_WORK_MODE_MASK (CEAL_MODE_WORK_MASK_GEAR| \
CEAL_MODE_WORK_MASK_PARK_BRAKE | \
CEAL_MODE_WORK_MASK_VEHICLE_SPEED)

config/meal/components/source/kso_aic_core_config.h
#define CEAL_KSO_AIC_WORK_MODE_MASK (CEAL_MODE_WORK_MASK_GEAR | \
CEAL_MODE_WORK_MASK_PARK_BRAKE | \
CEAL_MODE_WORK_MASK_VEHICLE_SPEED)

I hope this helps..

Thanks for your help
 
J

Joshua Landau

Here I am looking for the line that contains: "WORK_MODE_MASK", I want to print that line as well as the file name above it: config/meal/governor_mode_config.h
or config/meal/components/source/ceal_PackD_kso_aic_core_config.h.

SO the output should be something like this:
config/meal/governor_mode_config.h

#define GOVERNOR_MODE_WORK_MODE_MASK (CEAL_MODE_WORK_MASK_GEAR| \
CEAL_MODE_WORK_MASK_PARK_BRAKE | \
CEAL_MODE_WORK_MASK_VEHICLE_SPEED)

config/meal/components/source/kso_aic_core_config.h
#define CEAL_KSO_AIC_WORK_MODE_MASK (CEAL_MODE_WORK_MASK_GEAR | \
CEAL_MODE_WORK_MASK_PARK_BRAKE | \
CEAL_MODE_WORK_MASK_VEHICLE_SPEED)

(Please don't top-post.)

filename = None

with open("tmp.txt") as file:
nonblanklines = (line for line in file if line)

for line in nonblanklines:
if line.lstrip().startswith("#define"):
defn, name, *other = line.split()
if name.endswith("WORK_MODE_MASK"):
print(filename, line, sep="")

else:
filename = line

Basically, you loop through remembering what lines you need, match a
little bit and ignore blank lines. If this isn't a solid
specification, you'll 'ave to tell me more about the edge-cases.

You said that
#define CEAL_KSO_AIC_WORK_MODE_MASK (CEAL_MODE_WORK_MASK_GEAR | \
CEAL_MODE_WORK_MASK_PARK_BRAKE | \
CEAL_MODE_WORK_MASK_VEHICLE_SPEED)

was one line. If it is not, I suggest doing a pre-process to "wrap"
lines with trailing "\"s before running the algorithm:

def wrapped(lines):
wrap = ""
for line in lines:
if line.rstrip().endswith("\\"):
wrap += line

else:
yield wrap + line
wrap = ""

....
nonblanklines = (line for line in wrapped(file) if line)
....


This doesn't handle all wrapped lines properly, as it leaves the "\"
in so may interfere with matching. That's easily fixable, and there
are many other ways to do this.

What did you try?
 
D

Denis McMahon

Ok here is a snippet of the text file I have:
I hope this helps..
.....
Thanks for your help

ok ... so you need to figure out how best to distinguish the filename,
then loop through the file, remember each filename as you find it, and
when you find lines containing your target text, print the current value
of filename and the target text line.

filenames might be distinguished by one or more of the following:

They always start in column 0 and nothing else starts in column 0
They never contain spaces and all other lines contain spaces or are blank
They always contain at least one / characters
They always terminate with a . followed by one or more characters
All the characters in them are lower case

Then loop through the file in something like the following manner:

open input file;
open output file;
for each line in input file: {
if line is a filename: {
thisfile = line; }
elif line matches search term: {
print thisfile in output file;
print line in output file; } }
close input file;
close output file;

(Note this is an algorithm written in a sort of pythonic manner, rather
than actual python code - also because some newsreaders may break
indenting etc, I've used ; as line terminators and {} to group blocks)
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,772
Messages
2,569,593
Members
45,110
Latest member
OdetteGabb
Top