2016-07-18 2 views
1

Я пытаюсь прочитать некоторые данные из плоского файла и отобразить их в другом приложении с помощью Python. Мой плоский файл имеет 12 000 строк, и мне не нужны все данные. Мне нужно разобрать некоторые данные. То, что у меня на моем плоском файле, составляет 12 000 строк. Ряд строк имеет 00, кроме других данных, а другой блок имеет 10, кроме других данных в строке. Что я хочу сделать, так это разобрать все строки с 10 в нем и включить только те строки, которые имеют 00.Разбор данных из плоского файла

Ниже приведен обновленный файл с образцом. Я хочу разобрать все строки с 10. Также его просто образец, мой фактический плоский файл имеет 12 000 строк.

Я только что обновил свой плоский файл. Здесь я просто хочу читать строки с $ в начале и LOB после $ и 00 в конце до &. Я хочу разобрать все остальное в плоском файле.

$90TM020516 19002200& 
$90LOB 0 0 0 7 10 & 
$90LOB 25 0 0 6 10 & 
$90LOB 57 0 0 6 10 & 
$90LOB353 0 0 5 10 & 
$90LOB 36 0 0 5 10 & 
$90GPSA8 0 38281168 -77448376& 
$90LOB276 0 0 5 10 & 
$90LOB185 0 0 6 10 & 
$90LOB197 0 0 6 00 & 
$90LOB198 0 254 6 00 & 
$90LOB197 0 254 6 00 & 
RSSI $90LOB201 0 254 5 00 & 
$90TM020516 19002300& 
$90LOB194 0 254 5 00 & 
$90LOB190 0 254 5 00 & 
$90LOB185 0 254 5 00 & 
$90LOB181 0 254 5 00 & 
$90LOB187 0 254 5 00 & 
$90LOB192 0 254 5 00 & 
$90LOB195 0 254 5 00 & 
$90LOB195 0 254 5 00 & 
$90LOB191 0 254 5 00 & 
$90LOB184 0 254 5 00 & 
$90LOB177 0 254 5 00 & 

Ниже приведен код, я использую для чтения данных

for line in lines: 
     if (line[0] == '$'): 
     if (line[3:6] == 'LOB'): 
      if (line[22:24]=='00'): 

Я могу послать вам весь плоский файл, если вы хотите. Это просто выдержка из файла.

+0

Если вы хотите проверить код, вы можете сделать это по адресу http://codereview.stackexchange.com/, в противном случае укажите свою проблему. – muratgu

+0

Мне нравится ваше имя для начала. Итак, * Muscles *, пожалуйста, разместите образец файла, который вы пытаетесь проанализировать, содержащий пример строки, которую вы хотите сохранить, и одну из строк, которую вы хотите игнорировать. Во-вторых, размещение кода, который вы написали для этой задачи, было бы неплохо. –

ответ

1

Если я правильно понимаю ваш вопрос (и я не уверен, что я делаю) у вас есть файл с линиями, которые выглядят следующим образом:

@45 0 0 5 10 * 
@45 0 0 5 10 * 
@45 0 0 5 10 * 
@45 0 0 6 10 * 
@45 0 0 6 00 * 
@45 0 0 6 00 * 
@45 0 0 6 00 * 
@45 0 0 5 00 * 

... и вы хотите только читать строки которые имеют 00 и игнорировать те, которые имеют 10.

Вот пример кода, который бы сделать это:

# List containing all the lines you want to save 
lines_you_want = [] 

# Open the file with 12,000 lines 
with open('some.file', 'rb') as infile: 

    # Check if each line starts with 00 
    for line in infile: 

     # Check if the 15th character is a '0' instead of a '1' 
     if (line[15] == '0'): 
      lines_you_want.append(line) 

# Do something with lines_you_want 

Это предполагает, что 00 или 10 всегда находится в том же положении, в фи le (символы 15 и 16) и что эти два являются единственными, что может быть там (т. не 01, 11, 12, 29 или что-то еще), в противном случае вам придется это изменить.

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

Если я сделал неправильное предположение, прокомментируйте, и я отредактирую свой ответ.

+0

Единственный способ, которым это должно произойти, - это если строка не имеет не менее 16 символов. Это возможно? –

1
import re 
filename = <path to file> 
lines = [line.strip() for line in open(filename) if re.match(r'^\$.*LOB.*00 &$', line)] 

A regex101 example

Regex объясняет:

^ указывает на начало строки. Литеральное значение $ происходит сразу после начала строки. любое количество символов может наступить после, пока парсер не достигнет LOB. То же самое происходит снова для 00. Если этих строк нет, то это не вернет true для регулярного выражения этой строки.

Таким образом, конечный результат $ в начале и LOB после $ и & `. Он будет разбирать все остальное в файле.

Он хранится в виде списка строк, каждая строка представляет строку.

Бонус: Если вы выводя это в другой файл, то вы можете сделать это:

import re 
with open("FOO", 'w') as outfile, open('BAR', 'r') as infile: 
    for line in infile: 
     if re.match(r'^\$.*LOB.*00 &$', line): 
      outfile.write(line) 

Это дает:

$90LOB197 0 0 6 00 & 
$90LOB198 0 254 6 00 & 
$90LOB197 0 254 6 00 & 
$90LOB194 0 254 5 00 & 
$90LOB190 0 254 5 00 & 
$90LOB185 0 254 5 00 & 
$90LOB181 0 254 5 00 & 
$90LOB187 0 254 5 00 & 
$90LOB192 0 254 5 00 & 
$90LOB195 0 254 5 00 & 
$90LOB195 0 254 5 00 & 
$90LOB191 0 254 5 00 & 
$90LOB184 0 254 5 00 & 
$90LOB177 0 254 5 00 & 

Из данных образцов.

+0

Уважаемый Byrce, я обновил свой пост и посмотрю соответственно. – Muscles

Смежные вопросы