当前位置: 首页 > 知识库问答 >
问题:

将字符串拆分为固定长度的块,并在Raku中以单独的行写入

壤驷凯
2023-03-14

我有一个文件测试。txt文件:

Stringsplittingskills

我想读取此文件并写入另一个文件。txt,每行三个字符,如

Str
ing
spl
itt
ing
ski
lls

我所做的

my $string = "test.txt".IO.slurp;
my $start = 0;
my $elements = $string.chars;
# open file in writing mode
my $file_handle = "out.txt".IO.open: :w;
while $start < $elements {
    my $line = $string.substr($start,3);
    if $line.chars == 3 {
        $file_handle.print("$line\n") 
    } elsif $line.chars < 3 {
        $file_handle.print("$line")
    }      
    $start = $start + 3;
}
# close file handle
$file_handle.close

字符串的长度不是3的倍数时,此操作运行良好。当字符串长度是3的倍数时,它会在输出文件的末尾插入额外的换行符。当字符串长度是3的倍数时,如何避免在末尾插入新行?

我尝试了另一种更短的方法,

my $string = "test.txt".IO.slurp;

my $file_handle = "out.txt".IO.open: :w;
for $string.comb(3) -> $line {
    $file_handle.print("$line\n")
}

但它仍面临同样的问题。

我在这里寻找,在这里,但仍然无法解决它。

共有3个答案

裴曜灿
2023-03-14

正确的答案当然是使用. com b。加入

也就是说,这就是您修复代码的方式。

您可以更改if行以检查它是否在末尾,然后使用else。

if $start+3 < $elements {
    $file_handle.print("$line\n") 
} else {
    $file_handle.print($line)
}

就我个人而言,我会对其进行更改,以便只有添加的<代码>\n<代码>是有条件的。

while $start < $elements {
    my $line = $string.substr($start,3);
    $file_handle.print( $line ~ ( "\n" x ($start+3 < $elements) ));
    $start += 3;
}

这是因为

自<代码>真

'abc' x 1;     # 'abc'
'abc' x True;  # 'abc'

'abc' x 0;     # ''
'abc' x False; # ''

如果您非常谨慎,您可以使用x?
(实际上是3个独立的运算符。)

'abc' x   3; # 'abcabcabc'
'abc' x+? 3; # 'abc'

infix:« x »( 'abc', prefix:« + »( prefix:« ? »( 3 ) ) );

如果我要这样构造它,我可能会使用循环。

loop ( my $start = 0; $start < $elements ; $start += 3 ) {
    my $line = $string.substr($start,3);
    $file_handle.print( $line ~ ( "\n" x ($start+3 < $elements) ));
}

或者,您可以将其添加到除第一行之外的每一行的开头,而不是在每一行的末尾添加新行。

while $start < $elements {
    my $line = $string.substr($start,3);

    my $nl = "\n";

    # clear $nl the first time through
    once $nl = "";

    $file_handle.print($nl ~ $line);

    $start = $start + 3;
}
长孙德惠
2023-03-14

另一种使用substr-rw的方法。

subset PositiveInt of Int where * > 0;

sub break( Str $str is copy, PositiveInt $length )
{
    my $i = $length;

    while $i < $str.chars
    {
        $str.substr-rw( $i, 0 ) = "\n";
        $i += $length + 1;
    }

    $str;
}

say break("12345678", 3);

输出

123
456
78
佟嘉祯
2023-03-14
spurt "out.txt", "test.txt".IO.comb(3).join("\n")
 类似资料:
  • 我在一个名为string1到String7的程序中有七个字符串。 每个字符串的大小为30个字符。

  • 我想在JavaScript中使用空格作为分隔符将字符串分成固定大小的块(例如每个140个字符)(即它不应该分词),注意:它应该处理换行符目前我使用的是wordwrap npm包,但它不处理新行符。 它适用于普通文本,但如果文本包含新行标记,我会得到以下错误: syntaxerror:exports.runinthiscontext(VM.js:73:16) 在module._compile(mod

  • 问题内容: 有没有办法在不知道字符串长度的情况下,将一个字符长的字符串切成4个字符串,每个字符长? 例如: 问题答案:

  • 问题内容: 我正在使用以下内容从文本文件中读取一行: 并使用telnetlib.write命令将其输出到16个字符的LCD显示屏。如果读取的行长于16个字符,我想将其分解为16个字符长的字符串,并在一定的延迟(例如10秒)后将每个部分推出,一旦完成,代码应移至下一行输入文件,然后继续。 我曾尝试搜索各种解决方案并阅读itertools等。但是,我对Python的理解不足以使所有事情变得复杂,而如果

  • 问题内容: 如何在Java 中将字符串拆分为相等大小的子字符串。例如。大小相等的4个应该给出输出。 问题答案: 这是regex一线版: 是一个零宽度断言,它与上一个匹配结束的位置匹配。如果是以前没有的比赛,它的输入的开始,同相匹配。后面的封闭式匹配从最后一场比赛的末尾开始算起的四个字符的位置。 都是落后的,都是高级正则表达式功能,并非所有版本都支持。此外,在支持它的所有口味上实现的方式不一致。此技

  • 问题内容: 我有一张表,其中包含一列以可变长度定界的字符串,例如: 20,0,5 ,, ^ 24,0,0 ,, ^ 26,0,0 ,, ^ 281,0,0 ,, ^ 34,0,2 ,, ^ 48,0,2 ,, ^ 44, 0,2 ,, ^ 20,0,10 ,, ^ 20,5,5 ,, ^ 379,1,1 ,, ^ 26,1,2 ,, ^ 32,0,1 ,, ^ 71,0, 2,^ 我需要做的是拆分