2011-03-06 3 views
0

며칠 전에 직면 한 문제가 있습니다. 이 파일을 구문 분석하고 문자열을 날짜로 변환해야합니다. 나는 며칠 전에 다른 CSV 파일을 만들었습니다. 그러나 새 파일은 다음과 같은 오류를 표시합니다. java.text.ParseException : 파싱 할 수없는 날짜 : ""2011/03/4 ""jexcel api를 사용하여 문자열을 날짜로 구문 분석 할 수 없습니다.

왜 문자열이 둘 주위에 인쇄됩니까? 나는 이것이 그 문제의 근본 원인이라고 생각한다. 아래 코드를 게시하고 있습니다. 동일한 코드는 다른 파일에서 작동하며 날짜가 "3/4/2011"으로 인쇄되고 그 주위에 ""이 없어야합니다.

 WritableWorkbook wbwrite=null; 
    WritableSheet sheet=null; 
    Label lwrite=null; 
    BufferedReader br=null; 
    Number n=null; 

    String strFile="quotes.csv"; 
String strLine = ""; 
    String st[]; 
    String delimiter="[,]"; 

int lineNumber = 0, tokenNumber = 0; 
    int length=0; 
    int counter=0; 
    Calendar cal = Calendar.getInstance(); 

    DateTime datecell=null; 

    if(strFile.equals("quotes.csv")) 
    { 
     System.out.print("in loop if"); 

     try 
     { 
      File file=new File("quotes.xls"); 
      wbwrite=Workbook.createWorkbook(file); 
      System.out.print("file created"); 
      //path=file.getCanonicalPath(); 
      sheet = wbwrite.createSheet("Sheet 1", 0); 
      lwrite=null; 
      n=null; 
      Date dtest=null; 
      DateFormat df=null; 
      Date dadd=null; 

      df=new SimpleDateFormat("dd-mm-yy"); 

    //create BufferedReader to read csv file 
    br = new BufferedReader(new FileReader(strFile)); 
    strLine = ""; 
    //st[]=empty; 
      delimiter="[,]"; 
    lineNumber = 0; tokenNumber = 0; 
      length=0; 
    //read comma separated file line by line 
    while((strLine = br.readLine()) != null) 
    { 
     //System.out.print("strline="+strLine); 
     //break comma separated line using "," 
     st=strLine.split(delimiter); 
        length=0; 
     while(length<st.length) 
     { 
      //display csv values 
      // 
      System.out.println("Line # " + lineNumber + 
        ", Token # " + tokenNumber 
        + ", Token : "+ st[length]); 
          if(tokenNumber==2) 
          { 
           System.out.print("date="+st[length]); 
            DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy"); 
            Date date = (Date)formatter.parse(st[length]); 
            System.out.print("date="+date); 
            cal.setTime(date); 
            cal.set(Calendar.HOUR_OF_DAY, 17); 
            cal.set(Calendar.MINUTE, 30); 
            cal.set(Calendar.SECOND, 0); 
            cal.set(Calendar.MILLISECOND, 0); 
            date = cal.getTime(); 
            System.out.print("date="+date); 
            datecell=new DateTime(tokenNumber,lineNumber,date); 
            sheet.addCell(datecell); 
            lwrite=new Label(tokenNumber,lineNumber,st[length]); 
            sheet.addCell(lwrite); 
         } 
        if(tokenNumber==1||tokenNumber==5||tokenNumber==6||tokenNumber==7) 
        { 
          n=new Number(tokenNumber,lineNumber,Float.parseFloat(st[length])); 
          sheet.addCell(n); 
        } 
        tokenNumber++; 
        length++; 
    } 
    //reset token number 
      //tokenNumber = 0; 
} 
    wbwrite.write(); 
    wbwrite.close(); 
} 
catch(Exception e) 
{ 
     System.out.print("error="+e); 
} 
    } 
} 

답변

0

나는 그것을 풀었다. 문자열에는 파싱시 큰 따옴표가 사용되는 앞뒤에 따옴표가 이미 있습니다. 그래서 ""2011 년 3 월 4 일 "입니다. 나는

 if (st[length].startsWith("\"")) 
    { 
     st[length] = st[length].substring(1, st[length].length()); 
     } 
    if (st[length].endsWith("\"")) 
    { 
     st[length] = st[length].substring(0, st[length].length() - 1); 
    } 

플러스 심지어 날짜 형식이되었다 DD-MM-YYYY

을 추가; dd/MM/yyyy로 변경되었습니다. 이제 나는 정확한 답을 얻고있다.

관련 문제