【问题标题】:How does one efficiently replace strings in a massive CSV-based array, using dictionaries?如何使用字典有效地替换大量基于 CSV 的数组中的字符串?
【发布时间】:2018-04-02 02:10:01
【问题描述】:

我有一个非常大的数组,其中包含很多行和很多列(称为“self.csvFileArray”),它由我从 CSV 文件中读取的行组成,在处理 CSV 文件的类中使用以下代码...

with open(self.nounDef["Noun Source File Name"], 'rU') as csvFile:
  for idx, row in enumerate(csv.reader(csvFile, delimiter=',')):
    if idx == 0:
      self.csvHeader = row
    self.csvFileArray.append(row)

我有一个很长的替换映射字典,我想用它来替换...

replacements = {"str1a":"str1b", "str2a":"str2b", "str3a":"str3b", etc.}

我想在如下所示的类方法中执行此操作...

def m_globalSearchAndReplace(self, replacements):
  # apply replacements dictionary to self.csvFileArray...

我的问题:使用“replacements”字典替换整个数组“self.csvFileArray”中的字符串最有效的方法是什么?

澄清说明:

  1. 我查看了this post,但似乎无法让它适用于这种情况。

  2. 另外,我想替换匹配的单词中的字符串,而不仅仅是整个单词。因此,使用“SomeCompanyName”:“xyz”的替换映射时,我可能会有类似“SomeCompanyName 公司拥有名为 abcSomeCompanyNamedef 的产品的专利。”这样的句子。您会注意到该字符串包含在句子中被替换两次……一次作为整个单词,一次作为嵌入字符串。

【问题讨论】:

  • 能否请您添加您的阵列样本?
  • self.csvFileArray 的最终目的是什么?是否应该将所有行都保存到一个新文件中?
  • self.csvFileArray 表示从原始 CSV 文件中读取的所有行。我们正在构建一个“智能清理器”,它通过以不丢失“密钥完整性”的方式剥离机密数据来清理和转换数据,然后再将其写回到可以发送的新 CSV 文件中与供应商合作。
  • @MattR... 原始 CSV 太大。它们有超过 300 列和超过 1M 行。每行代表一个人。每列都有一个描述性特征。有些是非常基本的(名字、姓氏、年龄等)。有些是财务和健康信息。有些是提供多行 cmets 的段落。

标签: python arrays csv replace


【解决方案1】:

以下内容适用于上述内容并且已经过全面测试...

  def m_globalSearchAndReplace(self, dataMap):
    replacements = dataMap.m_getMappingDictionary()
    keys = replacements.keys()
    for row in self.csvFileArray: # Loop through each row/list
      for idx, w in enumerate(row): # Loop through each word in the row/list
        for key in keys: # For every key in the dictionary...
          if key != 'NULL' and key != '-' and key != '.' and key != '':
            w = w.replace(key, replacements[key])
        row[idx] = w
  1. 简而言之,遍历 csvFileArray 中的每一行并获取每个单词。

  2. 然后,对于行中的每个单词,循环访问字典的(称为“替换”)键以访问和应用每个映射。

  3. 然后(假设条件正确)将值替换为其映射值(在字典中)。

注意: 虽然它有效,但我不认为使用无限循环是解决问题的最有效方法,我相信必须有更好的方法,使用正则表达式。所以,我会暂时搁置一下,看看是否有人可以改进答案。

【讨论】:

  • 正则表达式也必须在整个时间内搜索,因此性能不会很好。此外,匹配正则表达式模式比字符串比较慢...
  • 我也许能凑齐一些东西,但不幸的是,这需要比我现在更多的时间......
【解决方案2】:

在一个大循环中?您可以将 csv 文件加载为字符串,这样您只需查看一次列表,而不是查看每个项目。虽然它的效率不是很高,因为 python 字符串是不可变的,但无论哪种方式,你仍然面临同样的问题。

根据这个答案Optimizing find and replace over large files in Python(重新效率),也许逐行会更好,所以如果这真的成为问题,你就不会在内存中拥有巨大的字符串。

编辑:所以像这样......

# open original and new file.
with open(old_file, 'r') as old_f, open(new_file, 'w') as new_f:
    # loop through each line of the original file (old file)
    for old_line in old_f:
        new_line = old_line
        # loop through your dictionary of replacements and make them.
        for r in replacements:
            new_line = new_line.replace(r, replacements[r])
        # write each line to the new file.
        new_f.write(new_line)

无论如何,我都会忘记该文件是 csv 文件,而只是将其视为一大堆行或字符。

【讨论】:

    猜你喜欢
    • 2016-08-31
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    • 1970-01-01
    • 2017-03-16
    相关资源
    最近更新 更多