2015-05-19 3 views
5

जंग में इस डी और जावा कोड के समान कुछ कैसे करें?फ़ाइल से लाइनों को पढ़ने, फ़िल्टर करने और संशोधित करने के लिए

जावा:

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

डी भाषा:

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

मैं इसे करने की कोशिश, लेकिन मैं यह सब स्वामित्व सामग्री के साथ खो गया हूँ

मेरी जंग कोड:

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

और तुम अब तक क्या किया है? आपको यह समझने के लिए पर्याप्त अनुभव होना चाहिए कि SO ऐसी साइट नहीं है जहां आप अपने काम को छोड़ दें "कृपया मेरे लिए यह करें" अन्य लोगों पर। – GhostCat

+0

मेरी गलती मैं बहुत जल्दी पोस्ट पर क्लिक करता हूं और महसूस नहीं करता कि यह मेरी कोशिश गायब है – Kozzi11

उत्तर

7

यहां आप जाएं:

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

यह कोड प्रत्येक पहले विभाजित भाग के लिए एक अलग स्ट्रिंग आवंटित करता है, लेकिन मुझे नहीं लगता कि इसे स्ट्रीमर स्ट्रीम किए बिना इसे टालना संभव है। और, ज़ाहिर है, यहां त्रुटि प्रबंधन वास्तव में ढीला है।

मुझे लगता है कि एक अनिवार्य दृष्टिकोण अधिक मुहावरेदार होगा, खासकर संबंध में हैंडलिंग त्रुटि के लिए:

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

अच्छा धन्यवाद इस समाधान के बारे में आप क्या सोचते हैं: http://www.abclinuxu.cz/zpravicky/rust-1.0#58 – Kozzi11

+0

@ Kozzi11 , अच्छा लग रहा है। स्वरूपण थोड़ा सा बंद है, और यदि आप इटरेटर्स का उपयोग करने का आग्रह करते हैं तो आप [itertoos] (https://crates.io/crates/itertools) से कुछ सुविधाजनक इटरेटर एडाप्टर का बेहतर उपयोग करेंगे, जैसे 'foreach()', ताकि आप 'अंतिम()' या कुछ के साथ चलाने के लिए हेरेटर को हैकली को मजबूर करने की आवश्यकता नहीं होगी। –

+0

@VladimirMatveev मेरा स्वरूपण अपरंपरागत है, हाँ :) itertools का उल्लेख करने के लिए धन्यवाद, यह नहीं पता था कि ... – kralyk

संबंधित मुद्दे

 संबंधित मुद्दे