我有一些大型数据集纯文本文件(维基百科文章),并且必须删除如下的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
答案 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,因为我在这里没有测试设置。可能有语法问题和/或更糟。幸运的是,有人会对其进行编辑或提供更好的解决方案,或者至少发表评论并指出我可能做错了什么。
希望有帮助。