Извлечение строки после новой строки - PullRequest
0 голосов
/ 22 июня 2011

У меня есть текстовый файл с чем-то вроде

Country1
city1
city2

Country2
city3
city4

Я хочу разделить страну и города.Есть ли быстрый способ сделать это?Я думаю о какой-то обработке файлов, а затем извлекать их в другие файлы. Это лучший способ или это можно быстро сделать с помощью регулярных выражений и т. Д.?

Ответы [ 9 ]

5 голосов
/ 22 июня 2011
countries=[]
cities=[]
with open("countries.txt") as f:
    gap=True
    for line in f:
        line=line.strip()
        if gap:
            countries.append(line)
            gap=False
        elif line=="":
            gap=True
        else:
            cities.append(line)
print countries
print cities

выход:

['Country1', 'Country2']
['city1', 'city2', 'city3', 'city4']

если вы хотите записать их в файлы:

with open("countries.txt","w") as country_file, open("cities.txt","w") as city_file:
    country_file.write("\n".join(countries))
    city_file.write("\n".join(cities))
2 голосов
/ 22 июня 2011
f = open('b.txt', 'r')
status = True
country = []
city = []
for line in f:
    line = line.strip('\n').strip()
    if line:
        if status:
            country.append(line)
            status = False
        else:
            city.append(line)
    else:
        status = True

print country
print city


output :

>>['city1', 'city2', 'city3', 'city4']
>>['Country1', 'Country2']
1 голос
/ 22 июня 2011
$countries = array();
$cities = array();
$gap = false;
$file = file('path/to/file');
foreach($file as $line)
{
  if($line == '') $gap = true;
  elseif ($line != '' and $gap) 
  {
    $countries[] = $line;
    $gap = false;
  }
  elseif ($line != '' and !$gap) $cities[] = $line;
}
1 голос
/ 22 июня 2011

В зависимости от того, насколько регулярно ваш файл, это может быть так просто в Python:

with open('inputfile.txt') as fh:
  # To iterate over the entire file.
  for country in fh:
    cityLines = [next(fh) for _i in range(2)]

    # read a blank line to advance countries.
    next(fh)

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

with open('inputfile.txt') as fh:
  # To iterate over the entire file.
  for country in fh:
    # we assume here that each country has at least 1 city.
      cities = [next(fh).strip()]

      while cities[-1]: # will continue until we encounter a blank line.
        cities.append(next(fh).strip())

Это ничего не делает, чтобы поместить данные в выходной файл или сохранить их намного дальше самого дескриптора файла, но это начало. Вы действительно должны выбрать язык для ваших вопросов, хотя. Много времени до

0 голосов
/ 23 июня 2011

Печать поля 1 с помощью awk - страны

awk 'BEGIN {RS="";FS="\n"} {print $1 > "countries"} {for (i=2;i<=NF;i++) print $i > "cities"}' source.txt 
0 голосов
/ 22 июня 2011

Это регулярное выражение будет работать для вашего примера:

/(?:^|\r\r)(.+?)\r(.+?)(?=\r\r|$)/s

Ловит страны в группе 1 и города в группе 2. Возможно, вам придется настроить символы новой строки, в зависимости от вашей системы. Они могут быть \ n, \ r или \ r \ n. edit: добавлен знак $, так что вам не нужно два переноса строки в конце. Вам понадобится флаг для dotall, чтобы регулярное выражение работало должным образом.

0 голосов
/ 22 июня 2011

Есть ли какая-то модель, которая отличает страны от городов? Или первая строка после пустой строки - это страна, а все последующие строки - названия городов до следующей пустой строки? В качестве альтернативы вы находите страны на основе справочной таблицы («словарь» в Python; ассоциативный массив в PHP; хеш в Perl - тот, который включает все официально признанные страны)?

Можно ли предположить, что нет городов, названия которых сталкиваются с какой-либо страной? Есть ли Франция, Айова, США или старая США, Япония?

Что вы хотите сделать с ними после того, как вы их разделили? Вы упомянули «некоторую обработку файлов, а затем извлечение их в другие файлы» - вы думаете о чем-то вроде одного файла на страну, содержащего список всех городов в нем? Или один каталог на страну и один файл на город?

Очевидный подход состоит в том, чтобы перебирать файл, построчно и поддерживать небольшой конечный автомат: пустой (начало файла, пустые строки между странами?), Во время которого вы переходите в состояние «страна» (всякий раз, когда вы находите любой шаблон, который соответствует любым критериям, означает, что вы встречали название страны). После того, как вы нашли название страны, вы находитесь в состоянии загрузки города. Я бы создал словарь, используя названия стран в качестве ключей и набор городов в качестве городов (хотя, возможно, вам действительно могут понадобиться графы / округа, кортежи названий городов в тех случаях, когда в стране есть несколько городов с одинаковым именем: Портленд, Мэн против Портленда, Орегон, например). Вы также можете иметь состояние «ошибка», если содержимое вашего файла приводит к некоторой двусмысленности (названия городов до того, как вы определили страну, два названия стран подряд и т. Д.).

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

0 голосов
/ 22 июня 2011

Другой пример PHP, который не читает весь файл в массиве.

<?php

$fh = fopen('countries.txt', 'r');

$countries = array();
$cities = array();

while ( $data = fgets($fh) )
{
  // If $country is empty (or not defined), the this line is a country.
  if ( ! isset($country) )
  {
    $country = trim($data);
    $countries[] = $country;
  }
  // If an empty line is found, unset $country.
  elseif ( ! trim($data) )
    unset($country);
  // City
  else
    $cities[$country][] = trim($data);
}

fclose($fh);

Массив $countries будет содержать список стран, а массив $cities будет содержать список городовпо странам.

0 голосов
/ 22 июня 2011

Не уверен, что это поможет, но вы можете попробовать использовать следующий код для получения словаря и затем работать с ним (запись в файлы, сравнение и т. Д.):

res = {}
with open('c:\\tst.txt') as f:
    lines = f.readlines()
    for i,line in enumerate(lines):
        line = line.strip()
        if (i == 0 and line):
            key = line
            res[key] = []
        elif not line and i+1 < len(lines):
            key = lines[i+1].strip()
            res[key] = []
        elif line and line != key:
            res[key].append(line)
print res
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...