从bash中的大文本文件中删除latin-1字符

时间:2018-09-19 13:48:14

标签: utf-8 dataset iso-8859-1

我有一些大型数据集纯文本文件(维基百科文章),并且必须删除如下的latin-1字符:

 kemer } şehir kır toplam }}
use specific terminology . for example , it is often more appropriate for people or things from ethiopia ( a country in africa ) to be described as ethiopian , not carelessly ( with the risk of stereotyping ) as african . 
 bat avg . 
 label ਕਾਲਜ
 ਅਡੋਲਫ ਹਿਟਲਰ ਨੇ ਦੇਸ਼ ਵਿਚ ਕਮਿਊਨਿਸਟ ਪਾਰਟੀ ਬਣਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਦੇਣ ਤੋਂ ਨਾਂਹ ਕਰ ਦਿਤੀ।
 alt }
        if not extra_units then
 utc_offset + 
 ਕਬਜਾ ( ) 
 demographics _title regional

我只想得到

ਕਾਲਜ
 ਅਡੋਲਫ ਹਿਟਲਰ ਨੇ ਦੇਸ਼ ਵਿਚ ਕਮਿਊਨਿਸਟ ਪਾਰਟੀ ਬਣਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਦੇਣ ਤੋਂ ਨਾਂਹ ਕਰ ਦਿਤੀ।

 ਕਬਜਾ

并最终修剪平凡的空白行。 我使用的方法是以下

<?php
$in = fopen('php://stdin','rb');
while($line = stream_get_line($in, 64000)) {
    foreach(str_split($line) as $char) {
        $ordChar = ord($char);
        if($ordChar > 127 || $ordChar <= 31) {
            echo $char;
        }
    }
}

cat wiki.hi.txt | php -d memory_limit=1024M escape_latin.php > wiki.hi.esc.txt

一样使用

这种方法行得通,唯一的问题是,随着文件大小的增加,性能会变得越来越差,正如我在使用的文件上使用watch du -h filename所看到的那样。我很惊讶,因为我正在处理本地磁盘,并且正在使用stream_get_line来获取流媒体中的行。

我在python中尝试了相同的方法,但是文件大小约为1GB时,我获得了几乎相同的性能。

有关更多详细信息,请参见here

[UPDATE] 我在这里报告的是其他提议方法的结果

使用regex方法,似乎会产生几乎相同的输出文件:

〜50MB 文件

$ time tr -d "[:alnum:][:punct:]" < wiki.as.txt > wiki.as.test.txt

real    0m2.990s
user    0m2.818s
sys 0m0.088s

〜100MB 文件

$ time tr -d "[:alnum:][:punct:]" < wiki.gu.txt > wiki.gu.test.txt

real    0m7.322s
user    0m6.772s
sys 0m0.282s

〜600MB 文件

$ time tr -d "[:alnum:][:punct:]" < wiki.ta.txt > wiki.ta.test.txt

real    0m35.973s
user    0m33.498s
sys 0m1.254s

一个〜1000MB(1GB)文件

$ time tr -d "[:alnum:][:punct:]" < wiki.ja.1.txt > wiki.ja.1.test.txt

real    1m5.409s
user    1m0.669s
sys 0m2.068s

1 个答案:

答案 0 :(得分:1)

尝试正则表达式。

如果您是通过CLI运行的,请尝试类似

tr -d "[:alnum:][:punct:]" < wiki.hi.txt > wiki.hi.esc.txt

如果您希望在php中做同样的事情-

<?php
$in = fopen('php://stdin','rb');
while($line = stream_get_line($in, 64000)) {
    echo preg_replace('/[:alnum:][:punct:]/', '', $line);        
}

但是检查这些内容,以确保它们正在执行您想要的操作-尤其是。 php,因为我在这里没有测试设置。可能有语法问题和/或更糟。幸运的是,有人会对其进行编辑或提供更好的解决方案,或者至少发表评论并指出我可能做错了什么。

希望有帮助。