2015-05-19 14 views
5

Làm cách nào để thực hiện điều gì đó tương tự với mã D và Java này trong Rust?Cách đọc, lọc và sửa đổi các dòng từ một tệp

Java:

import java.nio.file.*; 
import java.io.*; 

public class Main { 
    public static void main(String[] args) throws IOException 
    { 
     Files.lines(Paths.get("/home/kozak/test.txt")) 
      .filter(s -> s.endsWith("/bin/bash")) 
      .map(s -> s.split(":", 2)[0]) 
      .forEach(System.out::println); 
    } 
} 

ngôn ngữ D:

import std.algorithm; 
import std.stdio; 

void main() { 
    File("/home/kozak/test.txt") 
     .byLine 
     .filter!((s)=>s.endsWith("/bin/bash")) 
     .map!((s)=>s.splitter(":").front) 
     .each!writeln; 
} 

tôi thử nó, nhưng tôi bị mất với tất cả những thứ sở hữu này

đang rỉ của tôi:

use std::io::BufReader; 
use std::fs::File; 
use std::io::BufRead; 
use std::io::Lines; 

fn main() { 
    let file = match File::open("/etc/passwd") { 
     Ok(file) => file, 
     Err(..) => panic!("room"), 
    }; 

    let mut reader = BufReader::new(&file); 
    for line in reader.lines().filter_map(
     |x| if match x { Ok(v) => v.rmatches("/bin/bash").count() > 0, Err(e) => false} 
     { match x { Ok(v2) => Some(v2.split(":").next()), Err(e2) => None }} else 
     { None }) 
    { 
      print!("{}", line.unwrap()); 

    } 
} 
+2

Và anh đã làm gì cho đến nay? Bạn nên có đủ kinh nghiệm để hiểu rằng SO không phải là một trang web mà bạn chỉ cần bỏ công việc của bạn "hãy làm điều đó cho tôi" trên người khác. – GhostCat

+0

lỗi của tôi Tôi nhấp vào bài viết quá sớm và không nhận ra Đó là thiếu thử của tôi – Kozzi11

Trả lời

7

Đây là bạn:

use std::fs::File; 
use std::io::{BufRead, BufReader}; 

fn main() { 
    let f = BufReader::new(File::open("/etc/passwd").unwrap()); 
    let it = f.lines() 
     .map(|line| line.unwrap()) 
     .filter(|line| line.ends_with("/bin/bash")) 
     .map(|line| line.split(":").next().unwrap().to_owned()); 
    for p in it { 
     println!("{}", p); 
    } 
} 

Mã này phân bổ một chuỗi riêng biệt cho mỗi phần được chia tách đầu tiên, nhưng tôi không nghĩ rằng có thể tránh được chuỗi đó mà không cần trình lặp lặp. Và, tất nhiên, xử lý lỗi ở đây thực sự là lỏng lẻo.

Tôi đoán một cách tiếp cận bắt buộc sẽ được nhiều thành ngữ, đặc biệt là liên quan đến lỗi xử lý:

use std::fs::File; 
use std::io::{BufRead, BufReader}; 

fn main() { 
    let f = BufReader::new(File::open("/etc/passwd").unwrap()); 
    for line in f.lines() { 
     match line { 
      Ok(line) => if line.ends_with("/bin/bash") { 
       if let Some(name) = line.split(":").next() { 
        println!("{}", name); 
       } else { 
        println!("Line does not contain ':'"); 
       } 
      }, 
      Err(e) => panic!("Error reading file: {}", e) 
     } 
    } 
} 
+0

cảm ơn rất nhiều những gì bạn nghĩ về giải pháp này: http://www.abclinuxu.cz/zpravicky/rust-1.0#58 – Kozzi11

+0

@ Kozzi11 , có vẻ tốt. Định dạng là một chút mặc dù, và nếu bạn nhấn mạnh vào việc sử dụng trình vòng lặp, bạn nên sử dụng một số bộ điều hợp vòng lặp thuận tiện từ [itertoos] (https://crates.io/crates/itertools), như 'foreach()', vì vậy bạn sẽ không cần phải hackily buộc các iterator để chạy với 'last()' hoặc một cái gì đó. –

+0

@VladimirMatveev Định dạng của tôi không chính thống, có :) Cảm ơn bạn đã nhắc đến itertools, không biết rằng ... – kralyk

Các vấn đề liên quan