python - 在 CSV 中查找字符串的一部分并用新条目替换整个单元格?

标签 python bash csv awk sed

我有一个 CSV 文件,其中包含我要筛选的列。我想使用一个模式文件来查找模式存在的所有条目,即使是列值的一部分,并用这个“模式”替换整个单元格值。 我列出了一个关键字列表,我想将它们用作我的“模式”库; 因此,如果此列中的某个单元格(本例仅次于此)将此“模式”作为其字符串的一部分,那么我想用此“模式”替换整个单元格。

例如:

我的目标文件:

id1,Taxidermy Equipment & Supplies,moreinfo1
id2,Taxis & Private Hire,moreinfo2
id3,Tax Services,moreinfo3
id4,Tools & Hardware,moreinfo4
id5,Tool Sharpening,moreinfo5
id6,Tool Shops,moreinfo6
id7,Video Conferencing,moreinfo7
id8,Video & DVD Shops,moreinfo8
id9,Woodworking Equipment & Supplies,moreinfo9

我的“模式”文件:

Taxidermy Equipment & Supplies
Taxis
Tax Services
Tool
Video
Wood

输出文件:

id1,Taxidermy Equipment & Supplies,moreinfo1
id2,Taxis,moreinfo2
id3,Tax Services,moreinfo3
id4,Tool,moreinfo4
id5,Tool,moreinfo5
id6,Tool,moreinfo6
id7,Video,moreinfo7
id8,Video,moreinfo8
id9,Wood,moreinfo9

我想到了通常的“查找和替换”sed:

sed -i 's/PATTERN/REPLACE/g' file.csv

但我希望它在特定列上运行,所以我想到了:

awk 'BEGIN{OFS=FS="|"}$2==PATTERN{$2=REPLACE}{print}' file.csv

但它不适用于“字符串的一部分”([视频]:“视频和 DVD 商店”->“视频”)而且我似乎无法理解 awk 如何将输入作为文件用于“模式” block 。

是否有用于此的 awk 脚本?或者我是否必须写一些东西(例如在带有内置 csv 套件的 python 中?)

最佳答案

在 awk 中,使用 index。它仅在进行替换时打印记录,但即使没有匹配也很容易修改为打印(例如将 print $1,i,$3} 替换为 $0=$1 OFS i OFS $3} 1):

$ awk -F, -v OFS=, '
NR==FNR { a[$1]; next }          # store "patterns" to a arr
        { for(i in a)            # go thru whole a for each record
              if(index($2,i))    # if "pattern" matches $2
                  print $1,i,$3  # print with replacement
        }
' pattern_file target_file
id1,Taxidermy Equipment & Supplies,moreinfo1
id2,Taxis,moreinfo2
id3,Tax Services,moreinfo3
id4,Tool,moreinfo4
id5,Tool,moreinfo5
id6,Tool,moreinfo6
id7,Video,moreinfo7
id8,Video,moreinfo8
id9,Wood,moreinfo9

关于python - 在 CSV 中查找字符串的一部分并用新条目替换整个单元格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41537084/

相关文章:

python - 为什么我执行的四阶龙格库塔方法不起作用?

python - 保存 Altair 图表,周围没有空白

regex - Perl解析带有嵌入式逗号的CSV文件

python - 如何从 Python 2.7 中的 tell() 计数中排除\n 和\r

python - Django CMS 3.1 和 Django 1.7.8 自定义用户模型

ruby - 为什么在 bash 上执行 ruby​​ 命令到命令文件不起作用?

linux - BASH Linux 退出读取日志直到特定字符串

linux - 保留一对中的一个成员

java - Apache Commons CSV 不会忽略缺失的列

python - 数据框对象没有属性