繁体   English   中英

通过迭代将多个文件的列逐行粘贴在一起

[英]Pasting columns of multiple files together line by line by iterating

我想并排连接未知数量的文件,但我弄得有点乱。 该操作与 unix paste大致相似。 我以为我可以逐行遍历每个文件并将每个文件中的每个元素写入标准输出,但事实证明它比预期的要难。 也许有更好的方法?

每个文件看起来像

name1 value1
name2 value2
name3 value3
name4 value4

我想对第一个文件进行特殊处理,因为每一行都有一个标识符(名称如上例所示)。 众所周知,这些文件已排序且长度相同,因此在将文件粘贴在一起时无需检查任何内容。 对于第一个文件之后的每个文件,我不必再次编写名称字段,我可以只取值字段。 我什至还没有开始为拆分这些列而烦恼,因为我一直在同时迭代所有文件。

下面的代码无法编译,因为

use of moved value: `iterfiles`rustcE0382
combine.rs(17, 14): `iterfiles` moved due to this method call, in previous iteration of loop
use std::fs::File;
use std::io::{BufRead, BufReader};
use std::path::PathBuf;

pub fn combine(calls: Vec<PathBuf>) {
    let file1 = File::open(calls[0].clone()).unwrap();
    let reader = BufReader::new(file1).lines();
    let mut files = Vec::new();
    for file in &calls[1..] {
        files.push(BufReader::new(File::open(file).unwrap()).lines());
    }
    let iterfiles = files.iter();
    for line in reader {
        let mut line_out = Vec::new();
        line_out.push(line.unwrap());
        let rest_of_files: Vec<String> = iterfiles
            .map(|file2| file2.next().unwrap().unwrap())
            .collect();
    }
}

您需要将其移动到循环体中,然后使用iter_mut而不是iter

for line in reader {
    let mut line_out = Vec::new();
    line_out.push(line.unwrap());
    let rest_of_files: Vec<String> = files.iter_mut()
        .map(|file2| file2.next().unwrap().unwrap())
        .collect();
}

顺便说一句,您可以像这样构造files

let mut files: Vec<_> = calls[1..].iter()
    .map(|file| BufReader::new(File::open(file).unwrap()).lines())
    .collect();

而且您不需要file1clone

let file1 = File::open(&calls[0]).unwrap();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM