Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从分层csv生成平面文件(?)_Python_Shell_Csv_Data Structures_Text Files - Fatal编程技术网

Python 如何从分层csv生成平面文件(?)

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

我需要在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 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”的一次性变量。我最终设法解决了这个问题。前两行实际上不是前缀,而是整个层次结构的一部分;但我解释了这一点,并稍微改变了检测新级别的逻辑。它工作得很好。谢谢!