Analyser un fichier .txt
-
03-07-2019 - |
Question
J'ai un fichier .txt du type:
Symbols from __ctype_tab.o:
Name Value Class Type Size Line Section
__ctype |00000000| D | OBJECT |00000004| |.data
__ctype_tab |00000000| r | OBJECT |00000101| |.rodata
Symbols from _ashldi3.o:
Name Value Class Type Size Line Section
__ashldi3 |00000000| T | FUNC |00000050| |.text
Comment analyser ce fichier et obtenir les fonctions de type FUNC? Aussi, à partir de ce txt, comment puis-je analyser et extraire le nom .o?
Comment puis-je les obtenir par analyse sage des colonnes ou sinon comment.
J'ai besoin d'une aide immédiate ... En attente d'une solution appropriée, comme d'habitude
La solution
Je pense que cela pourrait coûter moins cher que l'utilisation de regex bien que je ne sois pas tout à fait clair sur ce que vous essayez d'accomplir
symbolList=[]
for line in open('datafile.txt','r'):
if '.o' in line:
tempname=line.split()[-1][0:-2]
pass
if 'FUNC' not in line:
pass
else:
symbolList.append((tempname,line.split('|')[0]))
J’ai appris dans d’autres publications qu’il était meilleur marché et plus avantageux de résumer toutes les données lorsque vous lisiez un fichier pour la première fois. Ainsi, si vous souhaitez résumer l’ensemble du fichier de données en un seul passage, vous pouvez alors effectuer les opérations suivantes:
fullDict={}
for line in open('datafile.txt','r'):
if '.o' in line:
tempname=line.split()[-1][0:-2]
if '|' not in line:
pass
else:
tempDict={}
dataList=[dataItem.strip() for dataItem in line.strip().split('|')]
name=dataList[0].strip()
tempDict['Value']=dataList[1]
tempDict['Class']=dataList[2]
tempDict['Type']=dataList[3]
tempDict['Size']=dataList[4]
tempDict['Line']=dataList[5]
tempDict['Section']=dataList[6]
tempDict['o.name']=tempname
fullDict[name]=tempDict
tempDict={}
Ensuite, si vous voulez le type Func, vous utiliserez les éléments suivants:
funcDict={}
for record in fullDict:
if fullDict[record]['Type']=='FUNC':
funcDict[record]=fullDict[record]
Désolé d'être si obsessionnel, mais j'essaie de mieux comprendre la création de listes compréhensives et j'ai décidé que cela valait le coup
Autres conseils
for line in open('thefile.txt'):
fields = line.split('|')
if len(fields) < 4: continue
if fields[3].trim() != 'FUNC': continue
dowhateveryouwishwith(line, fields)
Voici une approche de base. Qu'en penses-tu?
# Suppose you have filename "thefile.txt"
import re
obj = ''
for line in file('thefile.txt'):
# Checking for the .o file
match = re.search('Symbols from (.*):', line)
if match:
obj = match.groups()[0]
# Checking for the symbols.
if re.search('|', line):
columns = [x.strip() for x in a.split('|')]
if columns[3] == 'FUNC':
print 'File %s has a FUNC named %s' % (obj, columns[0])