跳至主要内容

用于去除和合并csv文件的命令行工具

项目描述

csvdedupe

用于使用dedupe python库的命令行工具,用于去除CSV文件中的重复项。

两个简单命令

csvdedupe - 接受一个混乱的输入文件或STDIN管道,并识别重复项。

csvlink - 接受两个CSV文件,并找到它们之间的匹配项。

在OpenNews Source上了解更多关于csvdedupe的信息

Build Status

安装和依赖关系

pip install csvdedupe

入门指南

csvdedupe

csvdedupe 接受一个混乱的输入文件或STDIN管道,并识别重复项。要开始,请选择三种去重策略之一:用参数调用csvdedupe、使用UNIX管道文件,或定义一个配置文件。

提供输入文件、字段名称和输出文件

csvdedupe examples/csv_example_messy_input.csv \
          --field_names "Site name" Address Zip Phone \
          --output_file output.csv

使用UNIX风格管道

cat examples/csv_example_messy_input.csv | csvdedupe --skip_training \
          --field_names "Site name" Address Zip Phone > output.csv

在配置文件中定义一切

csvdedupe examples/csv_example_messy_input.csv \
            --config_file=config.json

您的配置文件可能看起来像这样

{
  "field_names": ["Site name", "Address", "Zip", "Phone"],
  "field_definition" : [{"field" : "Site name", "type" : "String"},
                        {"field" : "Address", "type" : "String"},
                        {"field" : "Zip", "type" : "String",
                         "Has Missing" : true},
                        {"field" : "Phone", "type" : "String",
                         "Has Missing" : true}],
  "output_file": "examples/output.csv",
  "skip_training": false,
  "training_file": "training.json",
  "sample_size": 150000,
  "recall_weight": 2
}

要使用csvdedupe,您绝对需要

  • input 要去除重复项的CSV文件名或管道CSV文件

可以是

  • --config_file 配置文件的路径。

或者

  • --field_names dedupe需要注意的列名称列表

您可能还需要

  • --output_file OUTPUT_FILE 存储去重结果的CSV文件(默认:None)
  • --destructive 输出文件将仅包含唯一记录
  • --skip_training 跳过通过用户标记示例并仅从training_file读取训练(默认:False)
  • --training_file TRAINING_FILE 标记训练示例的新或现有文件的路径(默认:training.json)
  • --sample_size SAMPLE_SIZE 用于训练的随机样本对数量(默认:150000)
  • --recall_weight RECALL_WEIGHT 用于最大化我们的精确度和召回率的加权平均的阈值(默认:2)
  • -d, --delimiter 输入CSV文件的分隔符(默认:,)
  • -h, --help 显示帮助信息并退出

csvlink

csvlink 接收两个CSV文件并找出它们之间的匹配项。

提供输入文件、字段名称和输出文件

csvlink examples/restaurant-1.csv examples/restaurant-2.csv \
            --field_names name address city cuisine \
            --output_file output.csv

将每个文件的不同字段名称排列整齐

csvlink examples/restaurant-1.csv examples/restaurant-2.csv \
            --field_names_1 name address city cuisine \
            --field_names_2 restaurant street city type \
            --output_file output.csv

将输出管道传输到STDOUT

csvlink examples/restaurant-1.csv examples/restaurant-2.csv \
            --field_names name address city cuisine \
            > output.csv

在配置文件中定义一切

csvlink examples/restaurant-1.csv examples/restaurant-2.csv \
              --config_file=config.json

您的配置文件可能看起来像这样

{
  "field_names_1": ["name", "address", "city", "cuisine"],
  "field_names_2": ["restaurant", "street", "city", "type"],
  "field_definition" : [{"field" : "name", "type" : "String"},
                        {"field" : "address", "type" : "String"},
                        {"field" : "city", "type" : "String",
                         "Has Missing" : true},
                        {"field" : "cuisine", "type" : "String",
                         "Has Missing" : true}],
  "output_file": "examples/output.csv",
  "skip_training": false,
  "training_file": "training.json",
  "sample_size": 150000,
  "recall_weight": 2
}

要使用 csvlink,您绝对需要

  • input 两个要合并的CSV文件名

可以是

  • --config_file 配置文件的路径。

或者

  • --field_names_1 第一文件中用于去重的列名称列表
  • --field_names_2 第二文件中用于去重的列名称列表

您可能还需要

  • --output_file OUTPUT_FILE 存储去重结果的CSV文件(默认:None)
  • --inner_join 仅返回数据集之间的匹配项
  • --skip_training 跳过通过用户标记示例并仅从training_file读取训练(默认:False)
  • --training_file TRAINING_FILE 标记训练示例的新或现有文件的路径(默认:training.json)
  • --sample_size SAMPLE_SIZE 用于训练的随机样本对数量(默认:150000)
  • --recall_weight RECALL_WEIGHT 用于最大化我们的精确度和召回率的加权平均的阈值(默认:2)
  • -d, --delimiter 输入CSV文件的分隔符(默认:,)
  • -h, --help 显示帮助信息并退出

训练

csvdedupe 的“秘密配方”是人类输入。为了确定去重一组数据的最佳规则,您必须提供一组标记的示例供其学习。

您提供的标记示例越多,去重结果越好。至少,您应该尝试提供 10个正面匹配10个负面匹配

您的训练结果将保存到JSON文件中(默认为 training.json,除非使用 --training-file 选项指定其他名称)供csvdedupe的后续运行使用。

以下是一个标记操作的示例

Phone :  2850617
Address :  3801 s. wabash
Zip :
Site name :  ada s. mckinley st. thomas cdc

Phone :  2850617
Address :  3801 s wabash ave
Zip :
Site name :  ada s. mckinley community services - mckinley - st. thomas

Do these records refer to the same thing?
(y)es / (n)o / (u)nsure / (f)inished

输出

csvdedupe 尝试识别csv中所有指向同一事物的行。每组这样的记录称为一个簇。csvdedupe 返回您的输入文件,并增加一个名为 Cluster ID 的附加列,该列是分组记录的数字id(从零开始索引),或者如果csvdedupe认为该记录不属于任何簇,则为 x

csvlinkcsvdedupe 以类似的方式运行,但将两个CSV文件扁平化到一个输出文件中,类似于SQL OUTER JOIN 语句。您可以使用 --inner_join 标志排除两个输入文件之间不匹配的行,就像INNER JOIN一样。

预处理

csvdedupe 尝试将所有字符串转换为ASCII,忽略大小写、换行符和填充空白。所有这些可能都是无争议的,除了转换为ASCII。基本上,我们必须在两种处理扩展字符的方式之间做出选择。

distance("Tomas", "Tomás')  = distance("Tomas", "Tomas")

distance("Tomas, "Tomás") = distance("Tomas", "Tomzs")

我们选择了第一种方式。虽然可以进行更复杂的方法,但这种选项似乎对拉丁字母语言非常有效。

测试

核心csvdedupe函数的单元测试

pip install -r requirements-test.txt
nosetests

社区

食谱

合并并去重来自不同来源的文件。

假设我们有一些来自芝加哥早期儿童项目的来源,我们想得到一个规范列表。让我们用 csvdedupecsvkit 和一些其他常见的命令行工具来完成它。

对齐和堆叠

我们的第一个任务将对齐文件,以便堆叠时同一数据位于同一列。

首先,让我们看看文件的标题。

文件1

> head -1 CPS_Early_Childhood_Portal_Scrape.csv
"Site name","Address","Phone","Program Name","Length of Day"

文件2

> head -1 IDHS_child_care_provider_list.csv
"Site name","Address","Zip Code","Phone","Fax","IDHS Provider ID"

因此,我们必须将 "Zip Code"、"Fax" 和 "IDHS Provider ID" 添加到 CPS_Early_Childhood_Portal_Scrape.csv 中,我们必须将 "Program Name"、"Length of Day" 添加到 IDHS_child_care_provider_list.csv 中。

> cd examples
> sed '1 s/$/,"Zip Code","Fax","IDHS Provider ID"/' CPS_Early_Childhood_Portal_Scrape.csv > input_1a.csv
> sed '2,$s/$/,,,/' input_1a.csv > input_1b.csv
> sed '1 s/$/,"Program Name","Length of Day"/' IDHS_child_care_provider_list.csv > input_2a.csv
> sed '2,$s/$/,,/' input_2a.csv > input_2b.csv

现在,我们重新排列第二个文件的列以与第一个文件对齐。

> csvcut -c "Site name","Address","Phone","Program Name","Length of Day","Zip Code","Fax","IDHS Provider ID" \
         input_2b.csv > input_2c.csv

最后,我们终于准备堆叠了。

> csvstack -g CPS_Early_Childhood_Portal_Scrape.csv,IDHS_child_care_provider_list.csv \
           -n source \
           input_1b.csv input_2c.csv > input.csv

去重!

现在我们可以去重了

> cat input.csv | csvdedupe --field_names "Site name" Address "Zip Code" Phone > output.csv

让我们按重复ID对输出进行排序,然后我们就可以在您最喜欢的电子表格程序中打开它了。

> csvsort -c "Cluster ID" output.csv > sorted.csv

错误和错误

如果某些行为不符合直观,则视为错误,应予以报告。请在此处报告

补丁和拉取请求

我们欢迎您的建议!您可以通过以下方式提出建议:GitHub 问题(错误报告、功能请求、一般性问题),或者您可以通过拉取请求提交代码贡献。

如何贡献代码

  • 分支项目。
  • 添加您的功能或修复错误。
  • 发送带有您工作描述的拉取请求给我们!如果它还不够完美,请不要担心 - 将 PR 视为一个对话的开始,而不是一个成品。

版权和归属

版权(c)2016 DataMade。在 MIT 许可证 下发布。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源代码分发

csvdedupe-0.1.20.tar.gz (14.4 kB 查看哈希值

上传时间: 源代码

构建分发

csvdedupe-0.1.20-py2.py3-none-any.whl (14.0 kB 查看哈希值

上传时间: Python 2 Python 3

由以下机构支持