Chương trình của tôi phải đọc tệp văn bản - từng dòng một. Tệp trong UTF-8. Tôi không chắc chắn rằng các tệp là chính xác - có thể chứa các ký tự không thể in được. Có thể kiểm tra nó mà không cần đến cấp độ byte không? Cảm ơn.Kiểm tra dòng cho các ký tự không in được trong khi đọc tệp văn bản
Trả lời
Nếu bạn muốn kiểm tra một chuỗi có ký tự chưa in ra bạn có thể sử dụng một biểu thức chính quy
[^\p{Print}]
Điều này, tuy nhiên, bao gồm các khoảng trống và các ký tự tab trong tập hợp các ký tự không in của bạn trong khi chúng ảnh hưởng đến vị trí của các từ trong trang. –
Trong khi nó không phải là khó có thể làm điều này bằng tay sử dụng BufferedReader
và InputStreamReader
, tôi muốn sử dụng Guava:
List<String> lines = Files.readLines(file, Charsets.UTF_8);
Sau đó bạn có thể làm bất cứ điều gì bạn thích với những dòng.
EDIT: Lưu ý rằng điều này sẽ đọc toàn bộ tệp vào bộ nhớ trong một lần. Trong hầu hết các trường hợp, điều đó thực sự tốt - và chắc chắn là đơn giản hơn hơn đọc từng dòng một, xử lý từng dòng khi bạn đọc nó. Nếu đó là một tập tin khổng lồ, bạn có thể cần phải làm theo cách đó theo T.J. Câu trả lời của Crowder.
Dung dịch ổi đề xuất phương pháp có gọi lại Files.readLines (Tệp tệp, bộ ký tự Charset, LineProcessor
Nếu mục đích là xử lý từng dòng, việc sử dụng BufferedRead là đơn giản. Nó cũng quá tải để thêm một phụ thuộc thư viện khác chỉ để đọc dòng trong khi thư viện Java cốt lõi đã hỗ trợ điều đó. – user172818
@ user172818: Không, nó không đơn giản ... ít nhất là nếu bạn không sử dụng Java 7 với câu lệnh try-with-resources. Ngoài ra, tôi sẽ ngạc nhiên * ở bất kỳ chương trình Java không tầm thường nào mà không thể hưởng lợi từ Guava ở * nhiều * địa điểm. Đó là một thư viện tuyệt vời, và tôi sẽ không có nó. –
Mở tệp bằng FileInputStream
, sau đó sử dụng InputStreamReader
với UTF-8 Charset
để đọc các ký tự từ luồng và sử dụng BufferedReader
để đọc các dòng, ví dụ: qua số BufferedReader#readLine
, sẽ cung cấp cho bạn một chuỗi. Khi bạn có chuỗi, bạn có thể kiểm tra các ký tự không phải là những gì bạn cho là có thể in được.
Ví dụ: (Mà không kiểm tra lỗi), sử dụng try-with-resources (đó là trong phiên bản Java mơ hồ hiện đại):
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
}
}
Hoặc, trong một bước ít hơn, mở tệp bằng FileReader và sử dụng một BufferedReader để đọc dòng. –
@stviper: Và bây giờ là năm 2015, tôi đã cập nhật nó để sử dụng các tài nguyên thử nghiệm, sạch hơn nhiều. :-) –
@ abhisheknaik96: Cảm ơn bạn đã chỉnh sửa nhưng chỉ có bit 'isr' là đúng; '()' được giả định ** là '()', không phải '{}' và dấu chấm phẩy cuối cùng không được yêu cầu (nhưng nó được cho phép, vì vậy tôi đã bỏ qua nó - nhiều hơn để phù hợp với dòng trên nó). –
Nếu mỗi char trong file được mã hóa đúng cách trong UTF-8, bạn sẽ không có bất kỳ vấn đề đọc nó sử dụng đầu đọc có mã hóa UTF-8. Tùy thuộc vào bạn để kiểm tra tất cả các char của tập tin và xem nếu bạn xem xét nó có thể in hay không.
Chỉ cần phát hiện ra rằng với Java NIO (java.nio.file.*
), bạn có thể dễ dàng viết:
List<String> lines=Files.readAllLines(Paths.get("/tmp/test.csv"), Charset.forName("UTF-8"));
for(String line:lines){
System.out.println(line);
}
thay vì giao dịch với FileInputStream
s và BufferedReader
s ...
Chỉ muốn thêm, java.nio.file. * Có sẵn từ JDK 7 –
Có thể đáng nhắc đến tài liệu cho [Files.readAllLines] (http://docs.oracle.com/javase/7/docs/api /java/nio/file/Files.html): Phương pháp này là dành cho các trường hợp đơn giản, nơi thuận tiện để đọc tất cả các dòng trong một thao tác đơn lẻ. Nó không có ý định đọc trong các tệp lớn –
Làm thế nào về bên dưới:
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
}
Nguồn: http://devmain.blogspot.co.uk/2013/10/java-quick-way-to-read-or-write-to-file.html
Không - xóa điều này - bạn đang sử dụng mã hóa mặc định - và bước vào một thế giới đau đớn. –
Câu trả lời bởi @TJCrowder là Java 6 - trong java 7 câu trả lời hợp lệ là từng người @McIntosh - mặc dù sử dụng các Charset cho tên cho UTF -8 không được khuyến khích:
List<String> lines = Files.readAllLines(Paths.get("/tmp/test.csv"),
StandardCharsets.UTF_8);
for(String line: lines){ /* DO */ }
Nhắc nhở rất nhiều cách được đăng bởi Skeet ở trên - và tất nhiên cũng áp dụng cùng một điều kiện. Tức là, đối với các tệp lớn (Java 7):
BufferedReader reader = Files.newBufferedReader(path, StandardCharsets.UTF_8);
for (String line = reader.readLine(); line != null; line = reader.readLine()) {}
Tôi có thể tìm các cách sau để thực hiện.
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());
}
- 1. Ký tự cuối dòng từ dòng được đọc từ tệp văn bản, sử dụng Python
- 2. Đọc từ ký tự tệp văn bản theo ký tự
- 3. đọc tệp văn bản trong dòng R theo dòng
- 4. Đọc các tệp văn bản lớn có dòng trong C#
- 5. Đọc trong dòng tệp văn bản theo dòng php - dòng mới không được phát hiện
- 6. Cách in số ký tự trong mỗi dòng của tệp văn bản
- 7. Không được in các ký tự được bản địa hóa
- 8. Cách đọc từ một tệp văn bản, ký tự theo ký tự trong C++
- 9. Đọc các ký tự không phải ASCII từ một tệp văn bản
- 10. Phát hiện các ký tự không in được trong JavaScript
- 11. Các ký tự dòng mới trong vùng văn bản tăng độ dài văn bản trong C#
- 12. Đọc dòng tệp văn bản được nén lớn theo dòng trong python
- 13. Đọc tệp văn bản có ký tự không phải ASCII bằng mã hóa không xác định
- 14. Chèn văn bản Gujarati vào một bảng MySQL dẫn đến các ký tự rác và văn bản không đọc được
- 15. Python: đọc tất cả các dòng tệp văn bản trong vòng
- 16. python: đọc các dòng từ các tệp văn bản được nén
- 17. Chụp các ký tự ngắt dòng (dòng mới, dòng cấp dữ liệu) trong văn bản
- 18. Đọc từ một tệp văn bản và phân tích các dòng thành các từ trong C
- 19. kiểm tra ký tự
- 20. tự động hoặc kiểm tra chính tả nội dòng trong TexnicCenter cho các tệp latex
- 21. Trong khi vòng lặp, cách đọc từ dòng thứ hai của tệp văn bản
- 22. Lỗi khi đọc tệp văn bản trong php
- 23. Làm cách nào để đọc trong các dòng từ một tệp văn bản trong OCaml?
- 24. WinForms: Cách kiểm tra số ký tự tối thiểu trong hộp văn bản trong C#?
- 25. .net đăng ký đọc văn bản
- 26. Đọc một tệp văn bản trong java
- 27. Java: Đọc dòng lệnh mới từ một tệp văn bản
- 28. Đọc hai dòng văn bản theo dòng đồng thời -python
- 29. Đọc một ký tự tệp theo ký tự trong C
- 30. Cách tạo bản vá trong TortoiseSVN trong khi không có tệp nào được kiểm tra?
Bạn có muốn kiểm tra một dòng hoặc toàn bộ tệp không? –
Có đảm bảo rằng các nguồn cấp dữ liệu dòng là chính xác không? – Tarnschaf
kiểm tra một dòng. Có, nguồn cấp dữ liệu dòng là chính xác. – user710818