Pythonic очистка данных диапазонов адресов - PullRequest
0 голосов
/ 25 ноября 2018

Мне нужно знать, возможна ли следующая задача через Python.

У меня есть список из 4300 адресов, каждый из которых охватывает диапазон адресов, например:

  1. 8519-21 S Broadway
  2. 8700-6 Riverview Blvd
  3. 822-4 Angelica St
  4. 8442-6 N Broadway

Я хочувыделить первый адрес и последний в диапазоне.Итак, используя 1 в качестве примера, мне понадобится вывод, чтобы получить 8519 S Broadway и 8521 S Broadway, каждый в своем собственном ряду.

В некоторых случаях, например, 1 и 3, мне нужны только первые две цифры первого числа, чтобы завершить второй адрес.Я попытался в Excel, используя текст в столбцы (-), затем CONCATENATE и LEFT (ячейка, 2), но тогда я не получаю правильный адрес для экземпляров, таких как 2 и 4, где мне нужны первые три цифры адреса.Есть ли способ написать сценарий Python, чтобы решить эту проблему?

Ответы [ 3 ]

0 голосов
/ 25 ноября 2018

Допустим, ваш входной файл .csv выглядит следующим образом:

Address
8519-21 S Broadway
8700-6 Riverview Blvd
822-4 Angelica St
8442-6 N Broadway

, и вы хотите, чтобы он выглядел примерно так:

First Address,Last Address
8519 S Broadway,8521 S Broadway
8700 Riverview Blvd,8706 Riverview Blvd
822 Angelica St,824 Angelica St
8442 N Broadway,8446 N Broadway

Вы можете сделать это, используяcsv модуль:

from csv import writer

# open both input and output csv
with open("addresses.csv") as csv_in, open("output.csv", "w", newline="") as csv_out:
    csv_writer = writer(csv_out)

    # Skip 'Address' header
    next(csv_in)

    # Write new headers
    csv_writer.writerow(["First Address", "Last Address"])

    # Go through each line in csv
    for line in csv_in:

        # Split ranges from rest of line
        ranges, *rest = line.split()

        # Split ranges themselves
        start, end = ranges.split("-")

        # Get difference between length of numbers
        diff = len(start) - len(end)

        # Create new end address
        end = start[:diff] + end

        # Write new lines to output csv
        csv_writer.writerow([" ".join([start, *rest]), " ".join([end, *rest])])

, который выведет ваши результаты в output.csv .

0 голосов
/ 05 декабря 2018

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

import re
import csv
from csv import DictReader

dash_add = []

def get_address_list(file):
    with open(file) as f:
        reader = csv.DictReader(f)
        for row in reader:
            adds = row['Siteaddr']
            if "-" in adds:
                dash_add.append(adds)

z = []

def get_formatted_address(address):
        numeric = address.split(" ")[0]
        text = address.replace(numeric, "").strip()
        start = numeric.split("-")[0]
        end = numeric.split("-")[1]
        end = start[:-len(end)] + end
        return [start + " " + text,  end + " " + text]

get_address_list('./data/map_data_112318.csv')
[z.extend(get_formatted_address(i)) for i in dash_add]

with open('formatted_addresses.csv', 'w') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow(['Address'])
    for v in z:
        writer.writerows([[v]])
0 голосов
/ 25 ноября 2018

Попробуйте этот код:

addresses=["8519-21 S Broadway","8700-6 Riverview Blvd"]
output=[]
for i in addresses:
    output.append(i[0:i.find('-')]+i[i.find(' '):])
    numEnd=i[i.find('-')+1:i.find(' ')]
    numStart=i[0:i.find('-')-len(numEnd)]+numEnd+i[i.find(' '):]
    output.append(numStart)
print(output)

Где addresses - список диапазонов адресов в указанном вами формате, а output - требуемые данные.

...