2012-03-12 12 views
6

Ho creato CSVReader e sto cercando di leggere il file csv dalle risorse per questo motivo dovrei usare InputStream. Ma il mio codice qui sotto non ha il costruttore di inputstream. Qualcuno potrebbe dirmi come aggiungere o modificare qualcosa nel codice, quindi posso usare inputstream.CSVReader e InputStream

public class CSVReader { 

    private BufferedReader br; 

    private boolean hasNext = true; 

    private char separator; 

    private char quotechar; 

    private int skipLines; 

    private boolean linesSkiped; 

    public int linesCount = 0; 

    public static final char DEFAULT_SEPARATOR = '|'; 
    public static final char DEFAULT_QUOTE_CHARACTER = '"'; 
    public static final int DEFAULT_SKIP_LINES = 0; 

    public CSVReader(Reader reader) { 
     this(reader, DEFAULT_SEPARATOR, DEFAULT_QUOTE_CHARACTER, 
      DEFAULT_SKIP_LINES); 
    } 

    public CSVReader(Reader reader, char separator, char quotechar, int line) { 
     this.br = new BufferedReader(reader); 
     this.separator = separator; 
     this.quotechar = quotechar; 
     this.skipLines = line; 
    } 
    public String[] readNext() throws IOException { 

     String nextLine = getNextLine(); 
     return hasNext ? parseLine(nextLine) : null; 
    } 

    public String getNextLine() throws IOException { 
     if (!this.linesSkiped) { 
      for (int i = 0; i < skipLines; i++) { 
       br.readLine(); 
      } 
      this.linesSkiped = true; 
     } 
     String nextLine = br.readLine(); 
     if (nextLine == null) { 
      hasNext = false; 
     } 
     return hasNext ? nextLine : null; 
    } 


    public List<String[]> readAll() throws IOException { 

     List<String[]> allElements = new ArrayList<String[]>(); 
     while (hasNext) { 
      String[] nextLineAsTokens = readNext(); 
      if (nextLineAsTokens != null) 
       allElements.add(nextLineAsTokens); 
     } 
     return allElements; 

    } 

    private String[] parseLine(String nextLine) throws IOException { 

     if (nextLine == null) { 
      return null; 
     } 

     List<String> tokensOnThisLine = new ArrayList<String>(); 
     StringBuffer sb = new StringBuffer(); 
     boolean inQuotes = false; 
     do { 
      if (inQuotes) { 
       // continuing a quoted section, reappend newline 
       sb.append("\n"); 
       nextLine = getNextLine(); 
       linesCount++; 
       if (nextLine == null) 

        break; 
      } 
      for (int i = 0; i < nextLine.length(); i++) { 

       char c = nextLine.charAt(i); 
       if (c == quotechar) { 
        if(inQuotes 
         && nextLine.length() > (i+1) 
         && nextLine.charAt(i+1) == quotechar){ 
         sb.append(nextLine.charAt(i+1)); 
         i++; 
        }else{ 
         inQuotes = !inQuotes; 
         if(i>2 
           && nextLine.charAt(i-1) != this.separator 
           && nextLine.length()>(i+1) && 
           nextLine.charAt(i+1) != this.separator 
         ){ 
          sb.append(c); 
         } 
        } 
       } else if (c == separator && !inQuotes) { 
        tokensOnThisLine.add(sb.toString()); 
        sb = new StringBuffer(); 
       } else { 
        sb.append(c); 
       } 
      } 
     } while (inQuotes); 
     tokensOnThisLine.add(sb.toString()); 
     return (String[]) tokensOnThisLine.toArray(new String[0]); 

    } 

    public void close() throws IOException{ 
     br.close(); 
    } 

} 

risposta

15

È possibile costruire un InputStreamReader da quel InputStream

new InputStreamReader(myInputStream, encoding) 

Dove myInputStream è il vostro InputStream e encoding è un String che definisce la codifica utilizzata dal vostro origine dati.

È possibile chiamare il CSVReader in questo modo:

new CSVReader(new InputStreamReader(myInputStream, encoding)); 
+1

È * davvero * dovrebbe specificare la codifica da utilizzare per la lettura, utilizzando l'apposito [costruttore a due argomenti] (https://developer.android.com /reference/java/io/InputStreamReader.html#InputStreamReader(java.io.InputStream,%20java.lang.String)). –

+0

Non capisco come farlo. Potresti dirmi in modo specifico per favore. – fish40

+0

@JoachimSauer hai ragione, hai aggiornato la risposta – oers

Problemi correlati