Python 如何从分层csv生成平面文件(?)
我需要在csv上进行一些数据处理,其结构如下: 我需要折叠字段条目为null的行的文本列中的所有数据,并使其如下所示:Python 如何从分层csv生成平面文件(?),python,shell,csv,data-structures,text-files,Python,Shell,Csv,Data Structures,Text Files,我需要在csv上进行一些数据处理,其结构如下: 我需要折叠字段条目为null的行的文本列中的所有数据,并使其如下所示: FIELD TEXT P0190001, RACE OF HOUSEHOLDER BY HOUSEHOLD TYPE(8) Universe:Households White Family Households: Married-couple family: With related children P0190002, RACE OF HOUS
FIELD TEXT
P0190001, RACE OF HOUSEHOLDER BY HOUSEHOLD TYPE(8) Universe:Households White Family Households: Married-couple family: With related children
P0190002, RACE OF HOUSEHOLDER BY HOUSEHOLD TYPE(8) Universe:Households White Family Households: Married-couple family: No related children
。。。依此类推。(字段中第一个有效项之前的空白项数量并不总是两个,可能更多或更少)
对于一个大的(60000个唯一的“字段”)csv文件,有没有一种简单有效的方法可以做到这一点?我正在寻找在命令行上执行此操作的方法,而不是编写程序。这不是命令行解决方案,而是一个有趣的脚本
import csv
csv_reader = csv.reader(open('data.csv', 'rb'))
# Read first two rows of field text out as a prefix.
prefix = ' '.join(csv_reader.next()[2].strip() for i in range(2))
def collapsed_row_iter():
depth_value_list = []
for (_, field_id, field_text, _) in csv_reader:
# Count number of leading <SPACE> chars to determine depth.
pre_strip_text_len = len(field_text)
field_text = field_text.lstrip()
depth = pre_strip_text_len - len(field_text)
depth_value_list_len = len(depth_value_list)
if depth == depth_value_list_len + 1:
# Append a new depth value.
depth_value_list.append(field_text.rstrip())
if depth <= depth_value_list_len:
# Truncate list to depth, append new value.
del depth_value_list[depth:]
depth_value_list.append(field_text.rstrip())
else:
# Depth value is greater than current_depth + 1
raise ValueError
# Only yield the row if field_id value is non-NULL.
if field_id:
yield (field_id, '%s %s' % (prefix, ' '.join(depth_value_list)))
# Get CSV writer object, write the header.
csv_writer = csv.writer(open('collapsed.csv', 'wb'))
csv_writer.writerow(['FIELD', 'TEXT'])
# Iterate over collapsed rows, writing each to the output CSV.
for (field_id, collapsed_text) in collapsed_row_iter():
csv_writer.writerow([field_id, collapsed_text])
这不是一个命令行解决方案,而是一个有趣的脚本
import csv
csv_reader = csv.reader(open('data.csv', 'rb'))
# Read first two rows of field text out as a prefix.
prefix = ' '.join(csv_reader.next()[2].strip() for i in range(2))
def collapsed_row_iter():
depth_value_list = []
for (_, field_id, field_text, _) in csv_reader:
# Count number of leading <SPACE> chars to determine depth.
pre_strip_text_len = len(field_text)
field_text = field_text.lstrip()
depth = pre_strip_text_len - len(field_text)
depth_value_list_len = len(depth_value_list)
if depth == depth_value_list_len + 1:
# Append a new depth value.
depth_value_list.append(field_text.rstrip())
if depth <= depth_value_list_len:
# Truncate list to depth, append new value.
del depth_value_list[depth:]
depth_value_list.append(field_text.rstrip())
else:
# Depth value is greater than current_depth + 1
raise ValueError
# Only yield the row if field_id value is non-NULL.
if field_id:
yield (field_id, '%s %s' % (prefix, ' '.join(depth_value_list)))
# Get CSV writer object, write the header.
csv_writer = csv.writer(open('collapsed.csv', 'wb'))
csv_writer.writerow(['FIELD', 'TEXT'])
# Iterate over collapsed rows, writing each to the output CSV.
for (field_id, collapsed_text) in collapsed_row_iter():
csv_writer.writerow([field_id, collapsed_text])
LH列是否会随着每个新类别的变化而变化?LH列确实会变化,但与此无关。我不需要它。如果你有60000个,LH允许你索引类别。你能发布一个更大的样本吗?LH列是否会随着每个新类别的变化而变化?LH列确实会变化,但并不相关。我不需要它。如果你有60000个,LH允许你索引类别。你能发布一个更大的示例吗?嗨,德里克,这个脚本看起来不错,但我在编译它时遇到了麻烦。我得到的消息是:``Traceback(最近一次调用):文件“C:\collapse.py”,第40行,在for(field\u id,collapsed\u text)中,在collapsed\u row\u iter()中:文件“C:\collapse.py”,第28行,在collapsed\u row\u iter raise ValueError中,`field\u id从哪里获取其值?我没有看到它被初始化。很抱歉,我不懂python。在第28行的
else
子句中,语句raisevalueerror
会显式引发此错误,该语句在代码遇到比当前级别深>1级的深度级别时执行。我添加这一条款是因为我不确定你想如何处理这种情况<代码>字段\u id由csv\u读取器:中(\u,字段\u id,字段\u文本,_)的语句分配csv\u reader
是一个迭代器,返回文件中每行的列值列表。注意,该语句只需要4个列值,并将1和4赋给名为“\uOh”的一次性变量。我最终设法解决了这个问题。前两行实际上不是前缀,而是整个层次结构的一部分;但我解释了这一点,并稍微改变了检测新级别的逻辑。它工作得很好。谢谢!嗨,德里克,这个脚本看起来不错,但我在编译它时遇到了麻烦。我得到的消息是:``Traceback(最近一次调用):文件“C:\collapse.py”,第40行,在for(field\u id,collapsed\u text)中,在collapsed\u row\u iter()中:文件“C:\collapse.py”,第28行,在collapsed\u row\u iter raise ValueError中,`field\u id从哪里获取其值?我没有看到它被初始化。很抱歉,我不懂python。在第28行的else
子句中,语句raisevalueerror
会显式引发此错误,该语句在代码遇到比当前级别深>1级的深度级别时执行。我添加这一条款是因为我不确定你想如何处理这种情况<代码>字段\u id
由csv\u读取器:中(\u,字段\u id,字段\u文本,_)的语句分配csv\u reader
是一个迭代器,返回文件中每行的列值列表。注意,该语句只需要4个列值,并将1和4赋给名为“\uOh”的一次性变量。我最终设法解决了这个问题。前两行实际上不是前缀,而是整个层次结构的一部分;但我解释了这一点,并稍微改变了检测新级别的逻辑。它工作得很好。谢谢!