2014-06-28 120 views
0

我有一個csv文件,我的應用程序從互聯網上下載,然後解析。但是,每當我實際解析csv文件時,我的app force會在「Band = RowData [1];」行以及第1行關閉並出現錯誤。我從未處理過CSV文件,因此它會有所幫助有人可以告訴我如何正確獲取CSV文件的行數據並將行數據轉換爲字符串。這裏是CSV文件的位置:http://www.beaconschool.org/~markovic/lincoln.php獲取然後將CSV行數據導出到字符串(android)

我該如何讓它讀取我CSV文件中的所有內容,並將所有內容添加到共享首選項文件中?

此外,它似乎是有些工作,因爲它產生的這種共享偏好文件,其中包含以下內容

<?xml version='1.0' encoding='utf-8' standalone='yes' ?> 
<map> 
    <string name="title">""</string> 
    <string name="band">"ZQ11ISF1"</string> 
    <string name="description">""<br>""</string> 
    <string name="data">""</string> 
    <string name="class">"INSTRUCTIONAL SKILLS"</string> 
    <string name="number">"1"</string> 
    <string name="teacher">"MARKOVIC"</string> 
    <string name="date">""</string> 
    <string name="type">""</string> 
</map> 

這裏是我的應用程序,獲取並解析CSV文件,試圖代碼把該行的數據轉換成字符串

HttpClient httpClient = new DefaultHttpClient(); 
    HttpContext localContext = new BasicHttpContext(); 
    HttpGet httpGet = new HttpGet("http://www.beaconschool.org/~markovic/lincoln.php"); 
    HttpResponse response = httpClient.execute(httpGet, localContext); 
    String result = ""; 



    try { 
     Log.d("receiver", "animation stopped and downloaded file"); 
     BufferedReader reader = new BufferedReader(
     new InputStreamReader(
      response.getEntity().getContent() 

       ) 


       ); 


      String line; 
      while ((line = reader.readLine()) != null) { 
       String[] RowData = line.split(","); 
       Data = RowData[0]; 
       Band = RowData[1]; 
       Number = RowData[2]; 
       Class = RowData[3]; 
       Teacher = RowData[4]; 
       Title = RowData[5]; 
       Date = RowData[6]; 
       Type = RowData[7]; 
       Description = RowData[8]; 


       SharedPreferences.Editor localEditor = getActivity().getSharedPreferences("due_today", Context.MODE_PRIVATE).edit(); 

       localEditor.putString("data", Data.toString()); 
       localEditor.putString("band", Band.toString()); 
       localEditor.putString("number", Number.toString()); 
       localEditor.putString("class", Class.toString()); 
       localEditor.putString("teacher", Teacher.toString()); 
       localEditor.putString("title", Title.toString()); 
       localEditor.putString("date", Date.toString()); 
       localEditor.putString("type", Type.toString()); 
       localEditor.putString("description", Description.toString()); 

       localEditor.apply(); 

      Log.d("receiver", "information given to shared preferences"); 

      swipeLayout.setRefreshing(false); 

      } 

這裏是logcat的

06-28 01:21:24.662: W/dalvikvm(7808): VFY: unable to resolve direct method 82: Landroid/content/res/TypedArray;.<init> (Landroid/content/res/Resources;[I[II)V 
06-28 01:21:29.442: W/dalvikvm(7808): threadid=11: thread exiting with uncaught exception (group=0x41665ce0) 
06-28 01:21:29.452: E/AndroidRuntime(7808): FATAL EXCEPTION: AsyncTask #1 
06-28 01:21:29.452: E/AndroidRuntime(7808): Process: com.bernard.beaconportal, PID: 7808 
06-28 01:21:29.452: E/AndroidRuntime(7808): java.lang.RuntimeException: An error occured while executing doInBackground() 
06-28 01:21:29.452: E/AndroidRuntime(7808):  at android.os.AsyncTask$3.done(AsyncTask.java:300) 
06-28 01:21:29.452: E/AndroidRuntime(7808):  at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 
06-28 01:21:29.452: E/AndroidRuntime(7808):  at java.util.concurrent.FutureTask.setException(FutureTask.java:222) 
06-28 01:21:29.452: E/AndroidRuntime(7808):  at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
06-28 01:21:29.452: E/AndroidRuntime(7808):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
06-28 01:21:29.452: E/AndroidRuntime(7808):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
06-28 01:21:29.452: E/AndroidRuntime(7808):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
06-28 01:21:29.452: E/AndroidRuntime(7808):  at java.lang.Thread.run(Thread.java:841) 
06-28 01:21:29.452: E/AndroidRuntime(7808): Caused by: java.lang.ArrayIndexOutOfBoundsException: length=1; index=1 
06-28 01:21:29.452: E/AndroidRuntime(7808):  at com.bernard.beaconportal.Due_Today_Fragment$Update.doInBackground(Due_Today_Fragment.java:232) 
06-28 01:21:29.452: E/AndroidRuntime(7808):  at com.bernard.beaconportal.Due_Today_Fragment$Update.doInBackground(Due_Today_Fragment.java:1) 
06-28 01:21:29.452: E/AndroidRuntime(7808):  at android.os.AsyncTask$2.call(AsyncTask.java:288) 
06-28 01:21:29.452: E/AndroidRuntime(7808):  at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
06-28 01:21:29.452: E/AndroidRuntime(7808):  ... 4 more 
+0

rowdata的長度是多少?看起來像你正在獲取數組索引超出限制例外... –

+0

按長度你是指字符數? –

+1

看看字符串中的數據實際上是什麼,看起來你的行中沒有逗號。 –

回答

1

要避免ArrayIndexOutOfBoundsException,你可以嘗試這樣的事情!

String RowData[] = line.split(","); 
int noOfItems = RowData.length; 
int counter=0; 
Data = counter<noOfItems ? RowData[counter] : ""; 
counter++; 
Band = counter<noOfItems ? RowData[counter] : ""; 
counter++; 
Number = counter<noOfItems ? RowData[counter] : ""; 
counter++; 
Class = counter<noOfItems ? RowData[counter] : ""; 
counter++; 
Teacher = counter<noOfItems ? RowData[counter] : ""; 
counter++; 
Title = counter<noOfItems ? RowData[counter] : ""; 
counter++; 
Date = counter<noOfItems ? RowData[counter] : ""; 
counter++; 
Type = counter<noOfItems ? RowData[counter] : ""; 
counter++; 
Description = counter<noOfItems ? RowData[counter] : ""; 

上面的代碼將檢查是否數組包含值,並給出了rowData如果可用的值。否則,它將爲該字符串分配一個空(「」)值。空值可以被替換爲任何合適的值,例如「無數據可用」或「NA」等。

1

所以,你正在訪問第二項時的RowData大小爲1:

Caused by: java.lang.ArrayIndexOutOfBoundsException: length=1; index=1 

你確定要拆分後得到的RowData正確的大小?

String[] RowData = line.split(","); 

把支票取回的RowData項目前:

if (RowData.length > 1) { 
    Band = RowData[1]; 
} 

執行相同的其他任務。

+0

如果rowdata的大小大於1,我仍然可以檢索它嗎? –

+0

不,這就是爲什麼你需要把這張支票。 –

+0

那麼我怎樣才能讓它讀取我的CSV文件中的所有內容並將所有內容添加到共享首選項文件中? –

相關問題