删除列csv文件,其中一些包含带引号的文本(包括逗号)

时间:2018-10-30 17:38:28

标签: linux bash csv

我有一个具有数百列和80行的csv文件。我需要从文件中删除前13列。 我尝试使用:

  

cut -d,-f1-13 --complement input.csv> output.csv

但是问题是第一列中的一列包含带引号的文本(包括逗号),并且cut无法处理这种格式。 输入示例:

  

HeaderA,HeaderB,HeaderC,HeaderD,HeaderE,HeaderF,HeaderG,HeaderH   A,“ B,B”,C,“ D,D,D,D”,E,F,G,H   A,“ B,B”,C,“ D,D,D,D”,E,F,G,H   A,“ B,B”,C,“ D,D,D,D”,E,F,G,H

所需的输出:

  

HeaderE,HeaderF,HeaderG,HeaderH   E,F,G,H   E,F,G,H   E,F,G,H

在示例中,我在类似条件下使用较少的列。理想情况下,解决方案应该可以扩展到任意数量的列和行(在我的情况下为13列和80行)。 我曾尝试用awk寻找解决方案,但通常它们包括打印除要删除的那些列以外的所有列,由于列数巨大,这不是实际的解决方案。

2 个答案:

答案 0 :(得分:1)

在您指定的特定条件下,类似的事情会起作用:

grep -oE '(("[^"]+"|[^,]+),?){5}$' input.csv > output.csv

5中的{5}替换为您要保留的列数。因此,给定 N 列,其中前13个将被省略,该值将为 N - 13

注意: 如果任何带引号的列数据本身包含引号,则正则表达式将无法正确匹配。 "some \"data\" in quotes",尽管可以根据需要调整模式(但会变得很复杂)。

答案 1 :(得分:1)

您可以在python中使用熊猫来做到这一点。

为此,您可以编写一个简单的函数来执行以下操作:

  • 将csv加载到熊猫数据框
  • 删除不需要的列
  • 将所有内容保存回新的csv文件或相同的文件中。

代码:

import pandas as pd

def remove_columns_from_csv(data_path):
    #loading the file
    data_file = pd.read_csv(data_path)
    data = pd.dateFrame(data_file)

    # Use this list if you want to remove by columns names 
    columns_list = ['first_columns', 'second_column']

    # Use this list if you want to remove by index
    columns_list = [0,1,3] # subselection of columns you want removed
    data = data.drop(columns=columns_list)

    # saving the data back to a csv
    file_name = 'type the file name here'
    data.to_csv(file_name, sep='\t', encoding='utf-8')


# Function call    
datapath = 'C:\\Users\\default_user\\Documents\\csv_filename.csv'
remove_columns_from_csv(datapath)

注意:此处的索引从零开始,因此如果您的列号在csv中为1,则它将在python中对应于0。