2015-05-19 11 views
5

Wie können Sie etwas Ähnliches wie diesen D- und Java-Code in Rust machen?So lesen, filtern und ändern Sie Zeilen aus einer Datei

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); 
    } 
} 

D Sprache:

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; 
} 

Ich versuche es, aber ich bin mit all diesen Besitz Sachen verloren

mein Rost Code:

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

Und was haben Sie bisher getan? Sie sollten genug Erfahrung haben, um zu verstehen, dass SO keine Seite ist, auf der Sie Ihre Arbeit "Bitte machen Sie das für mich" einfach an andere Leute ablegen. – GhostCat

+0

meine Schuld, ich klicke Post zu früh und nicht erkennen, es fehlt mein Versuch – Kozzi11

Antwort

7

Hier gehts:

Dieser Code weist zwar für jeden ersten geteilten Teil eine separate Zeichenfolge zu, aber ich denke nicht, dass es ohne Streaming Iteratoren vermieden werden kann. Und natürlich ist die Fehlerbehandlung hier wirklich lax.

Ich denke, ein Imperativ Ansatz mehr idiomatischen wäre, insbesondere im Hinblick auf Handhabung Fehler:

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

schön vielen Dank, was denken Sie über diese Lösung: http://www.abclinuxu.cz/zpravicky/rust-1.0#58 – Kozzi11

+0

@ Kozzi11 , sieht gut aus. Die Formatierung ist jedoch ein wenig aus, und wenn Sie darauf bestehen, Iteratoren zu verwenden, verwenden Sie besser einige praktische Iterator-Adapter von [itertoos] (https://crates.io/crates/itertools), wie 'foreach()', also Sie muss den Iterator nicht hacky zwingen, mit 'last()' oder etwas zu laufen. –

+0

@VladimirMatveev Meine Formatierung ist unorthodox, ja :) Danke für die Erwähnung von itertools, wusste nicht, dass ... – kralyk

Verwandte Themen