Батареи включены, как обычно, с python. Здесь используется стандартный модуль lib csv:
import csv
with open(path, "r") as f:
csv_reader = csv.reader(f, delimiter=",")
for row_number, row in enumerate(csv_reader):
print(f"{row_number} => {row}")
Если stdlib не доступен по какой-то странной причине ... вам нужно будет токенизировать каждую строку с разделителями, разделителями и ячейкой ценности'. Опять же, это было бы тривиально с stdlib (import re
). Давайте представим, что у вас совсем нет батарей, просто plain python
.
Вам нужно будет понять, что то, как вы относитесь к каждому символу каждой строки, зависит от «контекста» и что этот контекст создается всеми предыдущие персонажи. Использование стека рекомендуется здесь. Вы вытягиваете sh и извлекаете состояния (или контексты) из стека в зависимости от текущего контекста (вершины стека) и текущего персонажа, с которым вы работаете. Теперь, учитывая контекст, вы можете обрабатывать каждый символ по-разному в зависимости от этого контекста:
class State:
IN_NON_DELIMITED_CELL = 1
IN_DELIMITED_CELL = 2
def get_cell_values(line, quotechar='"', separator=','):
stack = []
stack.append(State.IN_NON_DELIMITED_CELL)
cell_values = [""]
for character in line:
current_state = stack[-1]
if current_state == State.IN_NON_DELIMITED_CELL:
if character == quotechar:
stack.append(State.IN_DELIMITED_CELL)
elif character == separator:
cell_values.append("")
else:
cell_values[-1] += character
if current_state == State.IN_DELIMITED_CELL:
if character == quotechar:
stack.pop()
else:
cell_values[-1] += character
return cell_values
with open(path, "r") as f:
for line in f:
cell_values = tokenize(line, quotechar='"', delimiter=',')
print(cell_values)
Это хорошая отправная точка:
print(get_cell_values('"this","is",an,example,of,"doing things, the hard way?"'))
# prints:
['this', 'is', 'an', 'example', 'of', 'doing things, the hard way?']
Для дальнейшего развития этого (НАМНОГО), посмотрите на эти темы: токенизация строк, парсеры LL + LR, рекурсивный спуск, парсеры уменьшения смещения.