CSV - 删除/添加列或行 - 合并 CSV 文件

问题描述 投票:0回答:2
  1. 如何合并 2 个 CSV 文件? 如果我这样尝试,它不会添加任何列,而是将 2 文件添加为新行? 这些列以某种方式永远不会添加到最后(在最后一列之后)。但总是在第二行或最后一行末尾的下方。 product2.csv 只有标题,没有表格内容。可能是因为?

  2. 当我没有 CSV 文件但仍想附加一列时。我可以用 awk 或 sed 来做吗?

  3. 如何删除第 4 列?

  4. 如何删除第 4 行?

我试试

paste -d, product1.csv product2.csv > result.csv

cat product1.csv product2.csv > result.csv

csvjoin -d ";" product1.csv product2.csv

product1.csv

Id;ReferenceNumber;EAN;Manu;Price_B2BR;Price_B2BD;Price_B2BDP;Price_B2BDA;Price_B2CEV;Price_B2CIV;VATRate;VATCountry;Currency;Stock;Delivery;StockNextDeliveryAccessVolume;WarrantyCode;EOL;Promotion;NonReturnable;RemainingStock;ImagePrimary;ImageAdditional;ProductLink;GrossWeight;NetWeight;RelatedProducts;AccessoryProducts;AA
3910112;BP9641;1,83E+10;APC;191;191;0;0;0;0;19;DE;EUR;8;;0;GH24;0;0;0;0;;;;0,34;;;;502,8
4640420;A-LTO7XSA;6,92E+11;Tandberg Data;1344,9;1344,9;0;0;3633;4214,28;19;DE;EUR;1;04.11.2023;1;GH36;0;0;0;0;;;;5,75;;;;438
5180134;403358811;2,80E+09;Intel;252,9;252,9;0;0;0;0;19;DE;EUR;0;;0;G24;1;0;0;0;;;;0,01;;;;16,44
1480155;100380;;Microsoft;11;11;0;0;14,32;16,61;19;DE;EUR;100;;0;;0;0;0;0;;;;0;;;;34,75

product2.csv

Can be Sold?;Can be Purchased?;Product Type;Category;Unit of Measure;Purchase Unit of Measure;Customer Taxes;Vendor Taxes;Invoicing Policy;Description for Customers;Quantity On Hand;image path/url

我的结果总是这样:

结果.csv

Id;ReferenceNumber;EAN;Manu;Price_B2BR;Price_B2BD;Price_B2BDP;Price_B2BDA;Price_B2CEV;Price_B2CIV;VATRate;VATCountry;Currency;Stock;Delivery;StockNextDeliveryAccessVolume;WarrantyCode;EOL;Promotion;NonReturnable;RemainingStock;ImagePrimary;ImageAdditional;ProductLink;GrossWeight;NetWeight;RelatedProducts;AccessoryProducts;AA
3910112;BP9641;1,83E+10;APC;191;191;0;0;0;0;19;DE;EUR;8;;0;GH24;0;0;0;0;;;;0,34;;;;502,8
4640420;A-LTO7XSA;6,92E+11;Tandberg Data;1344,9;1344,9;0;0;3633;4214,28;19;DE;EUR;1;04.11.2023;1;GH36;0;0;0;0;;;;5,75;;;;438
5180134;403358811;2,80E+09;Intel;252,9;252,9;0;0;0;0;19;DE;EUR;0;;0;G24;1;0;0;0;;;;0,01;;;;16,44
1480155;100380;;Microsoft;11;11;0;0;14,32;16,61;19;DE;EUR;100;;0;;0;0;0;0;;;;0;;;;34,75
Can be Sold?;Can be Purchased?;Product Type;Category;Unit of Measure;Purchase Unit of Measure;Customer Taxes;Vendor Taxes;Invoicing Policy;Description for Customers;Quantity On Hand;image path/url

但它应该是这样的:

Id;ReferenceNumber;EAN;Manu;Price_B2BR;Price_B2BD;Price_B2BDP;Price_B2BDA;Price_B2CEV;Price_B2CIV;VATRate;VATCountry;Currency;Stock;Delivery;StockNextDeliveryAccessVolume;WarrantyCode;EOL;Promotion;NonReturnable;RemainingStock;ImagePrimary;ImageAdditional;ProductLink;GrossWeight;NetWeight;RelatedProducts;AccessoryProducts;AA;Can be Sold?;Can be Purchased?;Product Type;Category;Unit of Measure;Purchase Unit of Measure;Customer Taxes;Vendor Taxes;Invoicing Policy;Description for Customers;Quantity On Hand;image path/url
3910112;BP9641;1,83E+10;APC;191;191;0;0;0;0;19;DE;EUR;8;;0;GH24;0;0;0;0;;;;0,34;;;;502,8;;;;;;;;;;;;
4640420;A-LTO7XSA;6,92E+11;Tandberg Data;1344,9;1344,9;0;0;3633;4214,28;19;DE;EUR;1;04.11.2023;1;GH36;0;0;0;0;;;;5,75;;;;438;;;;;;;;;;;;
5180134;403358811;2,80E+09;Intel;252,9;252,9;0;0;0;0;19;DE;EUR;0;;0;G24;1;0;0;0;;;;0,01;;;;16,44;;;;;;;;;;;;
1480155;100380;;Microsoft;11;11;0;0;14,32;16,61;19;DE;EUR;100;;0;;0;0;0;0;;;;0;;;;34,75;;;;;;;;;;;;

CSV 文件如何识别新行的到来?无论我将它与什么合并,第二个文件总是在第二行。为什么?

csv awk sed merge paste
2个回答
0
投票

我将按照以下方式利用 GNU

AWK
完成此任务,为简洁起见,我将使用其他文件,让
file1.csv
内容为

id;name;price
1;Able;300
2;Baker;200
3;Charlie;100

file2.csv
内容是

category;unit;taxes

然后

awk 'BEGIN{FS=OFS=";"}NR==1{append=$0;next}FNR==1{$0=$0 ";" append;fieldsnum=NF}{NF=fieldsnum;print}' file2.csv file1.csv

给出输出

id;name;price;category;unit;taxes
1;Able;300;;;
2;Baker;200;;;
3;Charlie;100;;;

说明:我通知 GNU

AWK
在全局处理第一行时,分号既是字段分隔符(
FS
)又是输出字段分隔符(
OFS
)(第一个文件的第一行,观察到我先 ram
file2.csv
)我只是将整行(
$0
)存储在变量
append
中并指示GNU AWK转到
next
行所以没有做任何其他事情,当处理文件的第一行(第一行除外)时,我将整行与
;连接起来
append
,将之后的字段数保存在变量
fieldsnum
中,对于每一行,但全局第一行,我将
NF
设置为计算的字段数和
print
。如果行中的字段较少,则在末尾添加新字段并且为空。如果您想了解更多关于 FNR 或 NF 的 NR,请阅读8 强大的 Awk 内置变量 – FS、OFS、RS、ORS、NR、NF、FILENAME、FNR

(在 GNU Awk 5.0.1 中测试)


0
投票

我的建议是使用粘贴和Miller

如何合并 2 个 CSV 文件?

paste -d ";" product1.csv product2.csv > result.csv

您必须使用

-d ";"
,因为在您的文件中,字段分隔符是
;
.

当我没有 CSV 文件但仍想附加一列时。我可以用 awk 或 sed 来做吗?

mlr --csv --fs ";" put '$newColumn="lorem ipsum"' input.csv >output.csv

如何删除第 4 列?

mlr --csv --fs ";" --hi cut -x -f 4 input.csv>output.csv

--hi
设置编号的隐式 CSV 标头。

如何删除第 4 行?

mlr --csv --fs ";" filter -x 'NR==4' input.csv>output.csv
© www.soinside.com 2019 - 2024. All rights reserved.