我有一个具有数百列和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寻找解决方案,但通常它们包括打印除要删除的那些列以外的所有列,由于列数巨大,这不是实际的解决方案。
答案 0 :(得分:1)
在您指定的特定条件下,类似的事情会起作用:
grep -oE '(("[^"]+"|[^,]+),?){5}$' input.csv > output.csv
将5
中的{5}
替换为您要保留的列数。因此,给定 N
列,其中前13个将被省略,该值将为 N - 13
。
注意: 如果任何带引号的列数据本身包含引号,则正则表达式将无法正确匹配。 "some \"data\" in quotes"
,尽管可以根据需要调整模式(但会变得很复杂)。
答案 1 :(得分:1)
您可以在python中使用熊猫来做到这一点。
为此,您可以编写一个简单的函数来执行以下操作:
代码:
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。