【问题标题】:Deleting rows in CSV, if a field partially matches with another如果某个字段与另一个字段部分匹配,则删除 CSV 中的行
【发布时间】:2017-12-29 03:45:48
【问题描述】:

如果某个字段与其他字段部分匹配,我想删除 CSV 文件中的一行。

例如:

serial       book name                     author     

1.          Ramakrishna Kathamrita Vol1     Sri M     
2.          Ramakrishna Kathamrita Vol2     Sri M     
3.          Ramakrishna Kathamrita Vol3     Sri M     

我希望这三个只有一个条目。它应该只返回:

serial       book name          author  

 1.          Ramakrishna Kathamrita Vol1     Sri M   

有什么方法可以在 Python 中做到这一点?

编辑: (29-12-2017 17:05)

抱歉,不清楚。

我们可以设置以下标准。

  1. 如果书名包含n 字词,则至少第一个n-1 字词应匹配。
  2. 如果满足1.,则在询问用户时删除该行。

这个想法大致是这样的:

my_string1 = "Ramakrishna Kathamrita Vol1"
my_string2 = "Ramakrishna Kathamrita Vol2"    

splitted1 = my_string1.split()
splitted2 = my_string2.split()

if(splitted1[0] = splitted2[0] & splitted1[1] = splitted2[1])
     then ask the user whether to delete the row;wait for 'y/n'

我们还可以得到字数:

def word_count(string):
    tokens = string.split()
    n_tokens = len(tokens)
    return n_tokens

现在我们如何实现它 1) 对于 CSV 2)在询问时删除行

【问题讨论】:

  • “部分匹配”的标准是什么?一旦您可以定义您可以对 CSV 行进行分组并根据需要使用字典(或 collections.defaultdict)或使用 itertools.groupby() 组合它们。
  • 已编辑。希望问题现在很清楚。

标签: python csv


【解决方案1】:

如果一个字段与其他字段部分匹配。

您可以使用字符串距离算法。 StringDist 模块可能很有用,尽管您需要定义您的 similarity 标准。

【讨论】:

  • 编辑了问题。我一直在寻找不同的东西。
  • 那么你很接近了,使用split() 来计算单词,正则表达式也可以。使用word1.rsplit(None, 1)[0] == word2.rsplit(None, 1)[0]n-1 字词进行比较。循环遍历数据,但首先按书名排序,然后将上一个书名与当前书名进行比较。
猜你喜欢
  • 2020-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多