用于去除和合并csv文件的命令行工具
项目描述
csvdedupe
用于使用dedupe python库的命令行工具,用于去除CSV文件中的重复项。
两个简单命令
csvdedupe
- 接受一个混乱的输入文件或STDIN管道,并识别重复项。
csvlink
- 接受两个CSV文件,并找到它们之间的匹配项。
在OpenNews Source上了解更多关于csvdedupe的信息
安装和依赖关系
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
。
csvlink
与 csvdedupe
以类似的方式运行,但将两个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
社区
- Dedupe Google群组
- IRC频道,irc.freenode.net上的#dedupe
食谱
合并并去重来自不同来源的文件。
假设我们有一些来自芝加哥早期儿童项目的来源,我们想得到一个规范列表。让我们用 csvdedupe
、csvkit
和一些其他常见的命令行工具来完成它。
对齐和堆叠
我们的第一个任务将对齐文件,以便堆叠时同一数据位于同一列。
首先,让我们看看文件的标题。
文件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 许可证 下发布。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。