2016-12-19 3 views
0

Я работаю с большим количеством файлов (~ 4 гб), которые все содержат от 1 до 100 записей в следующем формате (между двумя *** это одна записи):Сценарий, извлекающий информацию из .txt в .csv для использования в Pandas

*** 
Type:status 
Origin: @z_rose yes 
Text: yes 
URL: 
ID: 95482459084427264 
Time: Mon Jul 25 08:16:06 CDT 2011 
RetCount: 0 
Favorite: false 
MentionedEntities: 20776334 
Hashtags: 
*** 
*** 
Type:status 
Origin: @aaronesilvers text 
Text: text 
URL: 
ID: 95481610861953024 
Time: Mon Jul 25 08:12:44 CDT 2011 
RetCount: 0 
Favorite: false 
MentionedEntities: 2226621 
Hashtags: 
*** 
*** 
Type:status 
Origin: @z_rose text 
Text: text and stuff 
URL: 
ID: 95480980026040320 
Time: Mon Jul 25 08:10:14 CDT 2011 
RetCount: 0 
Favorite: false 
MentionedEntities: 20776334 
Hashtags: 
*** 

Теперь я хочу, чтобы как-то импортировать их в панд для массового анализа, но, очевидно, я должен был бы преобразовать это в формат Панда может справиться. Поэтому я хочу, чтобы написать сценарий, который преобразует выше в .csv ищет что-то вроде этого (Пользователь название файла):

User Type Origin    Text URL ID    Time       RetCount Favorite MentionedEntities Hashtags 
4012987 status @z_rose yes   yes Null 95482459084427264 Mon Jul 25 08:16:06 CDT 2011 0   false 20776334   Null 
4012987 status @aaronsilvers text text Null 95481610861953024 Mon Jul 25 08:12:44 CDT 2011 0   false 2226621   Null 

`

(Извините за форматирование, но вы получите идею) Я не знаю, с чего начать, потому что Im очень новичок в написании языков, какой язык сценариев подходит для этой задачи? Я знаю о некоторых языках сценариев, но не знаком с их ограничениями и предпочитаю не тратить часы на изучение одного, чтобы узнать, что это невозможно. И не могли бы вы дать мне толчок в правильном направлении?

Заранее благодарен!

+0

Где «Пользователь» взялся? Является ли это именем файла, содержащего данные для этого пользователя? –

+0

Я снимаю свой вопрос. Пропущенная часть вашего ответа. –

ответ

0

Я рекомендую вам использовать запятые, а не пробелы, в качестве разделителей в ваших входных файлах для Pandas, в частности, поскольку некоторые из входных значений имеют встроенные в них заготовки. И если вы работаете с Пандами, то ради бога изучите хотя бы рудименты Питона.

vars = ['User', 'Type', 'Origin', 'Text', 'URL', 'ID', 'Time', \ 
    'RetCount', 'Favorite', 'MentionedEntities', 'Hashtags'] 

user = '12345' 
userfileName = '{}.txt'.format(user) 

items = {} 
for var in vars: 
    items[var]=var 
print (','.join([items[var] for var in vars])) 

first=True 
with open(userfileName) as userfile: 
    for line in userfile: 
     if line.startswith('*'): 
      continue 
     if line.startswith('Type'): 
      if first: 
       first=False 
      else: 
       print (','.join([items[var] for var in vars])) 
      items = {} 
      for var in vars: 
       items[var]='' 
      items['User']=user 
     p=line.find(':') 
     itemName=line[:p] 
     itemValue=line[1+p:].strip() 
     items[itemName]=itemValue 

print (','.join([items[var] for var in vars])) 
0

Предполагая, что файл имеет регулярные блоки 12 строки, я хотел бы предложить следующее словаря строительного подхода:

infile = open(....) 

records = [] 

# Get one 12-line block and split the lines, when possible 
block = [infile.readline().strip().split(':', 1) for i in range(12)] 

# Repean as needed 
while block[0][0]: 
    # Convert the non-star lines to a dictionary 
    records.append(dict(x for x in block if len(x)==2)) 
    block = [infile.readline().strip().split(':', 1) for i in range(12)] 

data = pd.DataFrame(records) 
print(data.columns) 
# Index(['Favorite', 'Hashtags', 'ID', 'MentionedEntities', 
#  'Origin', 'RetCount','Text', 'Time', 'Type', 'URL'], 
# dtype='object')