ตรวจสอบบรรทัดเพื่อหาอักขระที่ไม่สามารถพิมพ์ได้ขณะอ่านไฟล์ข้อความ

โปรแกรมของฉันต้องอ่านไฟล์ข้อความทีละบรรทัด ไฟล์ในรูปแบบ UTF-8 ฉันไม่แน่ใจว่าไฟล์ถูกต้อง - อาจมีอักขระที่ไม่สามารถพิมพ์ได้ สามารถตรวจสอบได้โดยไม่ต้องไปที่ระดับไบต์หรือไม่? ขอบคุณ.


person user710818    schedule 14.09.2011    source แหล่งที่มา
comment
คุณต้องการตรวจสอบบรรทัดเดียวหรือทั้งไฟล์?   -  person Eran Zimmerman Gonen    schedule 14.09.2011
comment
รับประกันว่าการป้อนบรรทัดถูกต้องหรือไม่?   -  person Tarnschaf    schedule 14.09.2011
comment
ตรวจสอบบรรทัดเดียว ใช่ การป้อนบรรทัดถูกต้อง   -  person user710818    schedule 14.09.2011
comment
คุณหมายถึงอักขระที่ไม่สามารถพิมพ์เป็นแบบอักษรเฉพาะได้หรือไม่? มีอักขระที่ไม่ได้กำหนดไว้ในแบบอักษรใดๆ นี่อาจเป็นสิ่งเดียวกัน   -  person Peter Lawrey    schedule 14.09.2011


คำตอบ (8)


หากคุณต้องการตรวจสอบว่าสตริงมีอักขระที่ไม่สามารถพิมพ์ได้ คุณสามารถใช้นิพจน์ทั่วไปได้

[^\p{Print}]
person Peter Lawrey    schedule 14.09.2011
comment
อย่างไรก็ตาม ซึ่งรวมถึงช่องว่างและอักขระแท็บในชุดอักขระที่ไม่สามารถพิมพ์ได้ของคุณ ในขณะที่อักขระเหล่านี้จะส่งผลต่อตำแหน่งของคำในหน้า - person bernard paulus; 06.09.2013

เปิดไฟล์ด้วย FileInputStream จากนั้นใช้ InputStreamReader ด้วย UTF-8 Charset เพื่ออ่านอักขระจากสตรีม และใช้ BufferedReader เพื่ออ่านบรรทัด เช่น ผ่าน BufferedReader#readLine ซึ่งจะทำให้คุณ เชือก เมื่อคุณมีสตริงแล้ว คุณสามารถตรวจสอบอักขระที่ไม่ใช่สิ่งที่คุณพิจารณาว่าจะพิมพ์ได้

เช่น. (โดยไม่มีการตรวจสอบข้อผิดพลาด) โดยใช้ try-with-resources (ซึ่งเป็นเวอร์ชัน Java สมัยใหม่ที่คลุมเครือ):

String line;
try (
    InputStream fis = new FileInputStream("the_file_name");
    InputStreamReader isr = new InputStreamReader(fis, Charset.forName("UTF-8"));
    BufferedReader br = new BufferedReader(isr);
) {
    while ((line = br.readLine()) != null) {
        // Deal with the line
    }
}
person T.J. Crowder    schedule 14.09.2011
comment
หรือเพียงขั้นตอนเดียว ให้เปิดไฟล์ด้วย FileReader และใช้ BufferedReader เพื่ออ่านบรรทัด - person Warren Dew; 28.04.2014
comment
@stviper: และตอนนี้ก็ปี 2558 ฉันได้อัปเดตเพื่อใช้การลองใช้ทรัพยากรซึ่งสะอาดกว่ามาก :-) - person T.J. Crowder; 07.01.2015
comment
@ abhisheknaik96: ขอบคุณสำหรับการแก้ไข แต่มีเพียง isr บิตเท่านั้นที่ถูกต้อง () ควรเป็น () ไม่ใช่ {} และไม่จำเป็นต้องใช้เครื่องหมายอัฒภาคสุดท้าย (แต่ได้รับอนุญาต ดังนั้นฉันจึงปล่อยไว้ -- มากกว่าเพื่อให้สอดคล้องกับบรรทัดด้านบน) - person T.J. Crowder; 14.04.2015

แม้ว่าการดำเนินการด้วยตนเองโดยใช้ BufferedReader และ InputStreamReader ไม่ใช่เรื่องยาก แต่ฉันจะใช้ Guava:

List<String> lines = Files.readLines(file, Charsets.UTF_8);

จากนั้นคุณสามารถทำอะไรก็ได้ตามต้องการด้วยบรรทัดเหล่านั้น

แก้ไข: โปรดทราบว่าการดำเนินการนี้จะอ่านไฟล์ทั้งหมดลงในหน่วยความจำในครั้งเดียว ในกรณีส่วนใหญ่ เป็นเรื่องปกติ และ ง่ายกว่า อย่างแน่นอนกว่าการอ่านทีละบรรทัด โดยประมวลผลแต่ละบรรทัดในขณะที่คุณอ่าน หากเป็นไฟล์ขนาดใหญ่ คุณอาจต้องทำเช่นนั้นตามที่ T.J. คำตอบของคราวเดอร์.

person Jon Skeet    schedule 14.09.2011
comment
Guava ยังเสนอวิธีการด้วย callback Files.readLines(ไฟล์ไฟล์, Charset charset, LineProcessor‹T› callback) - person Vlagorce; 21.08.2012
comment
หากจุดประสงค์คือการประมวลผลทีละบรรทัด การใช้ BufferedRead ก็ทำได้ง่ายเช่นกัน นอกจากนี้ยังเป็นการเกินความจำเป็นในการเพิ่มการพึ่งพาไลบรารีอื่นเพียงเพื่อการอ่านบรรทัดในขณะที่ไลบรารี Java หลักรองรับสิ่งนั้นแล้ว - person user172818; 26.12.2012
comment
@ user172818: ไม่ มันไม่ง่ายอย่างที่คิด... อย่างน้อยก็ไม่ใช่ถ้าคุณไม่ได้ใช้ Java 7 กับคำสั่ง try-with-resources นอกจากนี้ ฉัน ประหลาดใจ กับโปรแกรม Java ธรรมดาๆ ที่ไม่มีประโยชน์จาก Guava ใน หลายแห่ง มันเป็นห้องสมุดที่ยอดเยี่ยม และฉันจะขาดมันไปไม่ได้ - person Jon Skeet; 27.12.2012

เพิ่งพบว่าด้วย Java NIO (java.nio.file.*) คุณสามารถเขียนได้อย่างง่ายดาย:

List<String> lines=Files.readAllLines(Paths.get("/tmp/test.csv"), StandardCharsets.UTF_8);
for(String line:lines){
  System.out.println(line);
}

แทนที่จะจัดการกับ FileInputStreams และ BufferedReaders...

person McIntosh    schedule 11.10.2012
comment
เพียงต้องการเพิ่ม java.nio.file.* มีให้ใช้งานตั้งแต่ JDK 7 - person Jifeng Zhang; 14.05.2013
comment
มันอาจจะคุ้มค่าที่จะพูดถึงเอกสารสำหรับ ไฟล์ readAllLines : เมธอดนี้มีไว้สำหรับกรณีง่าย ๆ ซึ่งสะดวกในการอ่านทุกบรรทัดในการดำเนินการครั้งเดียว ไม่ได้มีไว้สำหรับการอ่านไฟล์ขนาดใหญ่ - person Remi Mélisson; 18.03.2014
comment
@fabian คุณพูดถูก ฉันใช้สิ่งนี้ตลอดเวลา :) - person McIntosh; 27.08.2019

ด้านล่างเป็นอย่างไรบ้าง:

 FileReader fileReader = new FileReader(new File("test.txt"));

 BufferedReader br = new BufferedReader(fileReader);

 String line = null;
 // if no more lines the readLine() returns null
 while ((line = br.readLine()) != null) {
      // reading lines until the end of the file

 }

ที่มา: http://devmain.blogspot.co.uk/2013/10/java-quick-way-to-read-or-write-to-file.html

person xproph    schedule 21.10.2013
comment
ไม่ - ลบสิ่งนี้ - คุณกำลังใช้การเข้ารหัสเริ่มต้น - และเข้าสู่โลกแห่งความเจ็บปวด - person Mr_and_Mrs_D; 17.06.2014

ฉันสามารถหาวิธีดังต่อไปนี้ได้

private static final String fileName = "C:/Input.txt";

public static void main(String[] args) throws IOException {
    Stream<String> lines = Files.lines(Paths.get(fileName));
    lines.toArray(String[]::new);

    List<String> readAllLines = Files.readAllLines(Paths.get(fileName));
    readAllLines.forEach(s -> System.out.println(s));

    File file = new File(fileName);
    Scanner scanner = new Scanner(file);
    while (scanner.hasNext()) {
        System.out.println(scanner.next());
    }
person Kumar Abhishek    schedule 15.04.2016

คำตอบโดย @T.J.Crowder คือ Java 6 - ใน java 7 คำตอบที่ถูกต้องคือคำตอบโดย @McIntosh - แม้ว่าการใช้ Charset สำหรับชื่อสำหรับ UTF -8 นั้นไม่สนับสนุน:

List<String> lines = Files.readAllLines(Paths.get("/tmp/test.csv"),
    StandardCharsets.UTF_8);
for(String line: lines){ /* DO */ }

เตือนให้นึกถึงวิธี Guava มากมายที่โพสต์โดย Skeet ด้านบน - และแน่นอนว่ามีคำเตือนแบบเดียวกัน นั่นคือสำหรับไฟล์ขนาดใหญ่ (Java 7):

BufferedReader reader = Files.newBufferedReader(path, StandardCharsets.UTF_8);
for (String line = reader.readLine(); line != null; line = reader.readLine()) {}
person Mr_and_Mrs_D    schedule 17.06.2014
comment
คำตอบที่ถูกต้องสำหรับ Java 6 ยังคงใช้ได้สำหรับ Java 7 - person user207421; 27.08.2019
comment
@ user207421 เมื่อมีวิธีที่ดีกว่าในการทำมันไม่ได้จริงๆ - person Mr_and_Mrs_D; 30.08.2019

หากอักขระทุกตัวในไฟล์ได้รับการเข้ารหัสอย่างเหมาะสมในรูปแบบ UTF-8 คุณจะไม่มีปัญหาในการอ่านโดยใช้โปรแกรมอ่านที่มีการเข้ารหัส UTF-8 ขึ้นอยู่กับคุณที่จะตรวจสอบทุกตัวอักษรของไฟล์และดูว่าคุณสามารถพิมพ์ได้หรือไม่

person JB Nizet    schedule 14.09.2011