【问题标题】:Rewrite a CSV : from a ; x to y kg ; to a ;x ; y重写一个 CSV : 从一个 ; x 至 y 公斤;到一个 ;x ;是的
【发布时间】:2015-08-02 07:41:22
【问题描述】:

我有一个看起来像这样的 CSV:

High_Female;18 to 28 cm;25 to 30 cm;52 to 62 cm
Weight_Male;8 to 10 Kg;4 to 6 Kg;28 to 32 Kg

我一般用这些函数把它转换成数组:

def parse_csv(content, delimiter = ';'):
    csv_data = []
    for line in content.split('\n'):
        # strips spaces also
        csv_data.append([x.strip() for x in line.split(delimiter )])
    return csv_data

我希望能够把事情变成:

High Female Max ; 28 ; 30; 62
High female Min ; 18 ; 25 ; 52
Weight Min ; 8 ; 4 ; 28
Weight Max ; 10 ; 6 ; 32

我只需要改造一下:

x to y unit

成一对 [x,y] 并取最小值和最大值并将它们放入一个数组中。

  1. 将“单位”替换为“”list.replace("unit","")
  2. 将“to”替换为“”
  3. 然后呢?使用.split 将字符串转换为列表

或者有什么更有效的方法?

【问题讨论】:

    标签: python string list csv


    【解决方案1】:

    我同意用正则表达式提取数字是最简单的,但接下来的格式化和处理如下:

    import csv
    import re
    
    content = [
        "High_Female;18 to 28 cm;25 to 30 cm;52 to 62 cm",
        "Weight_Male;8 to 10 Kg;4 to 6 Kg;28 to 32 Kg",
    ]
    
    for row in csv.reader(content, delimiter=';'):
        values = []
        for pair in row[1:]:
            values.append(map(int, re.findall(r'(\d+) to (\d+)', pair)[0]))
        highs = [max(v) for v in values]
        lows = [min(v) for v in values]
        label = row[0].replace('_', ' ')
        print('{} max ; {}'.format(label, ' ; '.join(str(high) for high in highs)))
        print('{} min ; {}'.format(label, ' ; '.join(str(low) for low in lows)))
    

    输出:

    High Female max ; 28 ; 30 ; 62
    High Female min ; 18 ; 25 ; 52
    Weight Male max ; 10 ; 6 ; 32
    Weight Male min ; 8 ; 4 ; 28
    

    【讨论】:

    • 感谢它像这样工作。我的版本更古老,但在最大/最小格式方面也有效:)。
    【解决方案2】:

    一个简单的转换,使用正则表达式:

    >>> s
    'High_Female;18 to 28 cm;25 to 30 cm;52 to 62 cm'
    >>> re.findall(r'(\d+) to (\d+)', s)
    [('18', '28'), ('25', '30'), ('52', '62')]
    

    然后您可以找到您的应用程序的最小值/最大值。将其插入您的函数:

    import csv
    
    def parse_csv(filename, delimiter=',')
        results = {}
        with open(filename, 'r') as f:
            reader = csv.reader(f, delimiter=delimiter)
            for row in reader:
                label = row[0].replace('_', ' ')
                mins = []
                maxes = []
                for line in row[1:]:
                    x,y = re.findall(r'(\d+) to (\d+)', line)
                    mins.append(int(x))
                    maxes.append(int(y))
                mins.sort()
                maxes.sort()
                results['{} Min:'.format(label)] = ';'.join(mins)
                results['{} Max:'.format(label)] = ';'.join(maxes)
        return results
    
    print(parse_csv('somefile.txt', ';'))
    

    【讨论】:

      【解决方案3】:

      你可以这样做:

      in_str = "18 to 28 cm"
      x,y = [int(s) for s in in_str.split() if s.isdigit()]
      print x, y
      

      你可以使用正则表达式...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-07
        • 1970-01-01
        • 1970-01-01
        • 2011-04-18
        相关资源
        最近更新 更多