首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用新行拆分超长(4 4GB)字符串

使用新行拆分超长(4 4GB)字符串
EN

Stack Overflow用户
提问于 2017-06-29 03:34:30
回答 5查看 189关注 0票数 3

我有一个应该是JSON对象的文件,每行一个。不幸的是,在创建文件时发生了通信错误,并且JSON对象之间只有一个空格,而没有换行符。

我需要通过用}\n{替换每个} {实例来解决这个问题。

对于sed或Perl来说应该很容易,对吧?

sed -e "s/}\s{/}\n{/g" file.in > file.out

perl -pe "s/}\s{/}\n{/g" file.in > file.out

但是file.in实际上是4.4 GB,这似乎给这两种解决方案都带来了问题。

sed命令以一个中途正确的文件结束,但是file.out只有335MB,并且只占输入文件的1/10左右,从一行中间截断。这几乎就像是sed在中途退出了。也许它试图将整个4.4 GB的文件加载到内存中,但在大约300MB时耗尽了堆栈空间,并悄悄地杀死了自己。

Perl命令出错,并显示以下消息:

[1] 2904 segmentation fault perl -pe "s/}\s{/}\n{/g" file.in > file.out

我还应该尝试什么?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2017-06-29 03:50:26

Perl中默认的输入记录分隔符是\n,但是您可以根据需要将其更改为任何字符。对于这个问题,你可以使用{ (八进制173)。

代码语言:javascript
复制
perl -0173 -pe 's/}\s{/}\n{/g' file.in > file.out
票数 1
EN

Stack Overflow用户

发布于 2017-06-29 04:33:12

与早期的解决方案不同,这个解决方案处理{"x":"} {"}

代码语言:javascript
复制
use strict;
use warnings;
use feature qw( say );

use JSON::XS qw( );

use constant READ_SIZE => 64*1024*1024;

my $j_in = JSON::XS->new->utf8;
my $j_out = JSON::XS->new;

binmode STDIN;
binmode STDOUT, ':encoding(UTF-8)';

while (1) {
   my $rv = sysread(\*STDIN, my $block, READ_SIZE);
   die($!) if !defined($rv);
   last if !$rv;

   $j_in->incr_parse($block);

   while (my $o = $j_in->incr_parse()) {
      say $j_out->encode($o);
   }
}

die("Bad data") if $j_in->incr_text !~ /^\s*\z/;
票数 4
EN

Stack Overflow用户

发布于 2017-06-29 03:49:18

代码语言:javascript
复制
perl -ple 'BEGIN{$/=qq/} {/;$\=qq/}\n{/}undef$\ if eof' <input >output
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44811130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档