Я хотел бы прочитать файл с разделителями, в котором первая строка является заголовком.
Целью данной реализации является не тратить память и время, чтобы создать словарь для каждой строки при попытке иметь эту индексацию работу: line[column_name]
Это моя реализация Python:Реализовать динамический класс с закрытием в C#, как в этом коде Python
def readf(filename):
for i, line in enumerate(open(filename)):
cols = line.strip().split('\t')
if i==0:
class Line:
_header = {col: i for i, col in enumerate(cols)}
def __init__(self, data):
self.data = data
def __getitem__(self, key):
return self.data[self._header[key]]
else:
yield Line(cols)
if __name__ == "__main__":
ll = []
for line in readf("hello.tsv"):
ll.append(line["col1"])
Может ли это быть реализовано в аналогичный способ в C#?
Я новичок в C# и из того, что я искал, пока не поддерживает определение класса в функции.
Закрытие на C#, похоже, не имеет полезных ресурсов в Интернете.
Благодаря
Edit: предыдущей реализации занимает 3.3s, следующих один принимает 4s для файла 1Гб около 1M линий
from itertools import izip
def readf(filename):
header = []
for i, line in enumerate(open(filename)):
cols = line.strip().split('\t')
if i==0:
header = list(cols)
else:
yield {header:cols for header,cols in izip(header, cols)}
if __name__ == "__main__":
ll = []
for line in readf("hello.tsv"):
ll.append(line["col1"])
Это, как представляется, проблема X-Y, чтение файла с разделителями табуляции в C# не должны «тратить» память. Что вы пытаетесь сделать с данными, прочитать все это в памяти и затем проиндексировать? –
сделать Hashset определенной группы столбцов – titus
Есть ли причина, по которой он должен выводить класс? Или будет работать простой выход пары «ключ-значение»? – MutantNinjaCodeMonkey