繁体   English   中英

如何拆分 CSV 文件中的值

[英]How to split values in a CSV file

我有一个如下所示的 CSV 文件。 现在它没有任何列,它包含一些我实际上不需要的字段,所以我需要根据某些条件将它写入一个新文件。

!PROJECT1, OBJECT1
2020-09-10+02:00,100,HHH,SAS,RM$20,1,1
2020-09-16+02:00,200,GGG,SAS,TAKE,2020-09-16+02:00
2020-09-13+02:00,300,TTT,SAS,TAKE,2020-09-13+02:00
2020-09-11+02:00,100,HHH,SAS,RM$20,1,1

这些是条件:

  1. 如果index[4]包含单词TAKE我只会写记录。 如果是这样,取index[0][4][5]
  2. Index[0] 和 [5] 需要在YEAR , MONTHDAYTD吐出和命名。 index[4]需要命名为TYPE

我希望我的新文件看起来像这样:

YEAR    MONTH    DAY    TD    TYPE    YEAR    MONTH    DAY    TD 
2020    09       16     2     TAKE     2020    09       16     2
2020    09       13     2     TAKE     2020    09       13     2

这是我的代码:

def filter_row(r):
    condition_1 = r[4] == 'TAKE' #<-- take only the TAKE's

with open(file_path, 'r') as my_file, open('outputfile.txt', 'w') as outer:
        reader = csv.reader(my_file, delimiter = ',')
        next(reader) #Skip the first row because it's just the header
        writer = csv.writer(outer, delimiter = '\t')
        for row in reader:            
                if filter_row(row):
                writer.writerow(row)

现在我的输出文件如下所示:

2020-09-16+02:00,  200,  GGG,   SAS,  TAKE,  2020-09-16+02:00
2020-09-13+02:00,  300,  TTT,   SAS,  TAKE,  2020-09-13+02:00

这里有两个任务。 首先过滤数据,然后解析数据,得到需要的值。

过滤可以使用内置的过滤器函数来完成(如果你愿意,也可以使用列表理解生成器表达式)。 对于解析,可以使用一个小函数,因为我们需要每行处理两个日期。

operator.itemgetter用于有效地从行中提取数据。

import csv
import operator

# Get the value of the 'take' column
type_getter = operator.itemgetter(4)
# Extract the columns we want to work with
columns_getter = operator.itemgetter(0, 4, 5)


def process_datestring(datestring):
    # Assumes offset is always positive; consider
    # using re.split if it could be positive or negative.
    date, _, offset = datestring.partition('+')
    dateparts = date.split('-')
    td, *_ = offset.partition(':')
    dateparts.append(td)
    return dateparts


headers = ['YEAR', 'MONTH', 'DAY', 'TD', 'TYPE', 'YEAR', 'MONTH', 'DAY', 'TD']
with open(file_path, 'r') as my_file, open('outputfile.txt', 'w') as outer:
    reader = csv.reader(my_file, delimiter = ',')
    next(reader) #Skip the first row because it's just the header
    writer = csv.writer(outer, delimiter = '\t')

    writer.writerow(headers)

    filtered = filter(lambda r: type_getter(r) == 'TAKE', reader)
    for row in filtered:
        date1, type_, date2 = columns_getter(row)
        out_row = process_datestring(date1)
        out_row.append(type_)
        out_row.extend(process_datestring(date2))
        writer.writerow(out_row)

你可以写一个解析函数。 像这样的东西:

def parser(row):
    if "TAKE" in row[4]: #Checks for your 'TAKE' statement
        year = row[0][0:4]
        month = row[0][5:7]
        ...
        year_2 = row[5][0:4]
        ...
        return [year, month, day, td, row[4], year_2, month_2,...]

把这整件事交给你的作家:

for row in reader:
    converted = parser(row)
    writer.writerow(converted)

这应该有效。 如果您想更加小心,您必须使用strptime将字符串转换为datetime.datetime对象,然后提取日期,但如果切碎字符串足够好,您可以这样做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM