2011-01-04 22 views
7

Được rồi ... Tôi có tập tin này .txt (UTF-8)Không thể phân tích như integer

4661,SOMETHING,3858884120607,24,24.09 
4659,SOMETHING1,3858884120621,24,15.95 
4660,SOMETHING2,3858884120614,24,19.58 

Và mã này

FileInputStream fis = new FileInputStream(new File(someTextFile.txt)); 
InputStreamReader isr = new InputStreamReader(fis, "UTF-8"); 
BufferedReader in = new BufferedReader(isr); 

int i = 0; 
String line; 
while((line = in.readLine()) != null) { 
Pattern p = Pattern.compile(","); 
String[] article = p.split(line); 

// I don't know why but when a first line starts with 
// an integer - article[0] (which in .txt file is 4661) 
// becomes someWeirdCharacter4661 so I need to trim it 
// *weird character is like |=>| 

if (i == 0) { 
    StringBuffer articleCode = new StringBuffer(article[0]); 
    articleCode.deleteCharAt(0); 
    article[0] = articleCode.toString(); 
} 

SomeArticle**.addOrChange(mContext, Integer.parseInt(article[0]), article[1], article[2], Integer.parseInt(article[3]), Double.parseDouble(article[4])); 

i++; 
} 

On giả lập nó là tốt nhưng trên thiết bị thực (HTC Desire) Tôi gặp lỗi này (lạ):

E/AndroidRuntime(16422): java.lang.NumberFormatException: unable to parse '4661' as integer 

Có vấn đề gì?

** nó chỉ là một số lớp học của tôi mà cần những thông số như là đầu vào (bối cảnh, int, string, string, int, double)

Trả lời

7

Nó có thể là tập tin của bạn không phải là UTF8 hay cái gì dọc theo những đường.

Tuy nhiên nếu bạn muốn sửa lỗi vì bạn không quan tâm đến vấn đề chỉ là giải pháp :), hãy loại bỏ bất kỳ thứ gì không phải là chữ số hoặc dấu thập phân.

String[] article = p.split(line); 
Integer i = Integer.parseInt(article[0].replaceAll("[^0-9.]","")); 

Cụm từ thông dụng không hoàn hảo (nó sẽ ảnh hưởng ... 999 .... ví dụ) nhưng nó sẽ làm cho bạn.

EDIT:

Tôi không đọc câu hỏi đúng cách. Nếu nó chỉ là lúc bắt đầu của tập tin sau đó nó rất có khả năng rằng những gì bạn có là một dấu thứ tự byte, được sử dụng để cho bạn biết nếu tập tin là unicode và cũng trong UTF16/32 cho dù đó là ít endian hoặc lớn endian. Bạn không cần phải nhìn thấy nó được sử dụng rất thường xuyên.

http://unicode.org/faq/utf_bom.html#bom10

+0

Có, nó hoạt động! :) Nhưng, tại sao nó chỉ hiển thị chữ số '4661'? Đâu là phần "có vấn đề" khác của chuỗi? – svenkapudija

+0

Không có ý tưởng nào nếu không thấy tệp của bạn. Có thể tệp gốc của bạn có mã hóa lẻ hoặc bị hỏng. – monkjack

3

tôi sẽ thêm này như là một lời nhận xét nhưng quyết định bao gồm một hình ảnh là tốt. Có vẻ như vấn đề không phải là tập tin không phải là UTF-8 nhưng trên thực tế điều ngược lại là đúng - có vẻ như nó là UTF-8 nhưng nó không được đọc chính xác.

Hình ảnh từ trình chỉnh sửa hex xem tệp UTF-8 mà tôi đã tạo chứa dòng đầu tiên. Lưu ý 3 ký tự trước 4661 ...

alt text

Nếu tôi lưu file ở định dạng ANSI, những nhân vật không phải ở đó.

1

Bạn có thể sử dụng Notepad ++, mở tệp văn bản, chọn menu Mã hóa -> "Mã hóa bằng UTF-8 không có BOM" và lưu với tùy chọn này. Các byte được mã hóa (EF BB BF) sẽ bị xóa, vì vậy mã của bạn có thể phân tích chuỗi thành số nguyên mà không gặp bất kỳ sự cố nào.

Hy vọng trợ giúp này.

0

Tôi đã chuyển đổi tệp để đọc thành định dạng ascii và tệp được đọc chính xác trong một ứng dụng tương tự.

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