2016-05-03 1 views
0

Я пытаюсь разобрать вывод SQL-запроса в Python (не удается установить cx_Oracle из-за ограничений org, следовательно, нужно перейти подпроцесс путь.Python split (' n') разбивает строку на полпути, а не после конца строки

Вот мой вывод команды подпроцесса

output1 = sqlplus.communicate()[0].split('\n') 

['', '05/02/2016 19:42:40,ABC,O\t\t\t\t ,ACTIVE', '\t 49', '', '05/02/2016 19:42:40,ABC,O\t\t\t ,INACTIVE', '\t 11', ''] 

Так что дата имеет смысл, я пытаюсь удалить все пробелы и вкладки, но есть один столбец, который дает мне головную боль .

Когда я пытаюсь удалить лишний материал из более раннего выпуска с подкопкой e, последний столбец попадает в следующую строку вместо того, чтобы оставаться в той же строке. Я знаю, что это, вероятно, из-за ведущей \ t (tab) в последнем столбце, но я не могу ее удалить. Я пытался с часами использовать полосы, lstrip, rstrip, regexes, но безрезультатно.

for line in output1: 
    if(line != ''): 
      print ",".join([str(x.strip()) for x in line.split(',')]) 

Ниже мой окончательный вывод, но с последнего столбца в следующей строке

05/02/2016 19:53:52,ABC,O,ACTIVE 
49 
05/02/2016 19:53:52,ABC,O,INACTIVE 
11 

Нужна помощь в поиске, что я не хватает. Заранее спасибо за все ваши входы :)

--Jim

+1

Ваш 'output1', кажется, показывает, что« последний столбец », по сути, * уже * в новой строке на выходе' communication() '. Посмотрите, как вторая строка заканчивается сразу после 'ACTIVE', а затем' '\ t 49'' является третьей строкой. Вы уверены, что вывод внешней команды выглядит так, как вы думаете? – user2357112

+1

Возможно, внешняя команда вставляет разрывы строк, чтобы попытаться сделать свою собственную линию. – user2357112

+0

Ваш код игнорирует пустые строки и удаляет пробелы вокруг запятых в значениях, разделенных запятыми. Но он не объединяет отдельные элементы списка в одну строку. – Barmar

ответ

1

Похоже, что вы хотите, чтобы каждый ряд, чтобы быть строки в между пустыми строками в списке? Эти пустые строки создаются split() в '/ n/n', поэтому, когда есть пустая строка. Вы можете просто разделить на эти пустые строки первых:

output1 = '\n05/02/2016 19:42:40,ABC,O\t\t\t\t ,ACTIVE\n\t 49\n\n05/02/2016 19:42:40,ABC,O\t\t\t ,INACTIVE\n\t 11\n' 
output1 = output1.split('\n\n') 

Вы можете использовать серию замен, расколы, полосы, и присоединяется к повторной сборки, расщепление на запятых и пробелов, за исключением пробелов.

for line in output1: 
    line = line.replace(' ', '(^_^)') 
    line = line.split() 
    line = [word.replace('(^_^)', ' ').strip() for word in line] 
    line = ','.join([word.strip(',') for word in line]) 
    print line 
+0

Ваш метод сработал, но только один раз этот случай отсутствует ... , НЕАКТИВНО ',' \ t 4 ', Что мне делать с этим? –

+0

Я не вижу этот случай в выводе, который вы предоставили. Не могли бы вы описать формат вывода из sqlplus или, может быть, включить ваш вызов subprocess.Popen или subprocess.call? – ipsnicerous

+0

Наконец-то я сделал это так (применил регулярное выражение, чтобы выбрать только те символы, которые я хочу, а затем разделил на запятую. line = re.sub ("[^ 0-9, a-zA-Z: \ /]", '', line) line = line.split (',') Это определенно оставляет некоторые пробелы вокруг моих фактических данных, но поскольку я вставляю материал обратно в Oracle, я удалял несколько пробелов с помощью Oracle TRIM(). Thx для вашего Помогите! –