2015-03-02 154 views
0

我會盡我所能來解釋我的問題,所以我很抱歉如果這篇文章的部分是令人困惑。我有兩列數據,如下所示: -從java導出數據到excel

enter image description here剛剛有6000多行。我想要做的是獲取其rt值在2範圍內的每個mz值之間的差異。因此,例如,使用此帖子上的圖像,第2行(100.9035)中的mz值和第2行中的mz值6(102.9007)的RT值分別爲8.07和7.36,即RT值相差在2以內。由此,我想從第二個減去第一個mz值的值來計算差異,然後將這些信息導出到excel中。我希望對所有在2秒範圍內(不是+或 - 2)的mz值進行此過程。

爲此,我首先將mz和rt值分隔成兩個單獨的文本文件,然後創建一個2d雙精度數組,並從兩個文件中填充數組(這可能是一個不必要的方法,但我的級別的腳本是非常簡單的)。這樣做之後,我通過使用if和for條件遍歷數組來找到彼此相距2 rt內的mz值並獲取它們之間的差異。這是我用Java編寫的,到目前爲止腳本: -

import java.io.BufferedReader; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.FileReader; 
import java.io.IOException; 

import org.apache.poi.hssf.usermodel.HSSFWorkbook; 
import org.apache.poi.hssf.usermodel.HSSFWorkbook; 
import org.apache.poi.ss.usermodel.Cell; 
import org.apache.poi.ss.usermodel.Row; 
import org.apache.poi.ss.usermodel.Sheet; 
import org.apache.poi.ss.usermodel.Workbook; 

public class qexactiveDiff { 

    public static void main(String[] args) throws IOException { 

     Workbook wb = new HSSFWorkbook(); 
     Sheet sheet1 = wb.createSheet("Data"); 
     Sheet sheet2 = wb.createSheet("AdditionalData"); 


     double[][] mzValues = new double[6427][2]; 

     BufferedReader mzBr = new BufferedReader(new FileReader(
       "C:/Users/colles-a-l-kxc127/workspace/Maldi/src/Neg_mzs.txt")); 

     BufferedReader rtBr = new BufferedReader(new FileReader(
       "C:/Users/colles-a-l-kxc127/workspace/Maldi/src/Neg_rts.txt")); 

     String mzLine = mzBr.readLine(); 

     String rtLine = rtBr.readLine(); 

     for (int i = 0; i < 6427; i++) { 

      if (mzValues != null || rtLine != null) { 

       mzValues[i][0] = Double.parseDouble(mzLine); 

       mzValues[i][1] = Double.parseDouble(rtLine); 

       mzLine = mzBr.readLine(); 

       rtLine = rtBr.readLine(); 

      } 

     } 

     for (int i = 0; i < 6427; i++) {  //6427 is num of rows  


      Double rt = mzValues[i][1]; 
      Double mz = mzValues[i][0]; 

      Row row = sheet1.createRow(i); 
      Row row2 = sheet2.createRow(i); 
      Cell cell = row.createCell(0); 
      Cell cell2 = row2.createCell(0); 

      cell.setCellValue(mz); 

     // System.out.println("Mz: " + mz + " | " + "RT: " + rt); 

      for (int j = 0; j < 6427; j++) { 

       Double rt2 = mzValues[j][1]; 

       Double mz2 = mzValues[j][0]; 

       Double rtDiff = rt2 - rt; 

       int counter = 0; 

       if (rtDiff < 2 && rtDiff > -2) { 

        counter++; 

        if(counter < 255){ 

         cell = row.createCell(j + 1); 
         cell.setCellValue(mz2 - mz); 

        } 

        else{ 

         cell2 = row.createCell(j + 1); 
         cell2.setCellValue(mz2 - mz); 

        } 

      //  System.out.println("Index: " + j + " Mz difference: " 
      //    + (mz2 - mz) + " RT: " + rt2); 

       } 
      } 

     } 

     try { 

      FileOutputStream output = new FileOutputStream("Data.xls"); 
      wb.write(output); 
      output.close(); 

     } catch (Exception e) { 

      e.printStackTrace(); 
     } 

    } 

} 

這可能是一個有點難以遵循這是很骯髒的腳本,但我只是想獲得基本的工作。我注意到,當我試圖做到這一點之前,我不斷提出一個關於列範圍的錯誤,因爲我寫的數據超出了電子表格允許的列範圍,所以我試圖設計一種方法,繼續編寫一旦數據超出列範圍(通過在代碼中使用計數器實現的255列),將數據轉移到另一個表中,但我仍然收到錯誤消息。我知道java並不是執行此任務的最理想的工具,但它是我唯一具有一定經驗的語言。有沒有辦法導出數據,以便我可以克服允許的列範圍問題?

謝謝

+0

真的沒有想到這樣做的那方式,雖然我不知道我將如何去在Excel中做它 – user2062207 2015-03-02 15:29:52

+0

您是否超出了sheet1或sheet2上的列限制? – 2015-03-02 15:34:06

+0

您是否考慮嘗試使用.xslx來解決列限制問題? – Compass 2015-03-02 15:34:22

回答