• 締切済み

javaでcsvファイル読込時の改行について

javaでcsvファイルを読込・データ登録処理を作成しているのですが、 現在はjavaのreadLine()を使用して読込んでいます。 既存のreadLine()では\rまたは\n、および\r\nにて改行とみなしているようですが、 これを\r\nの場合のみ改行としたいと思っています。 どなたか良い方法をご存知でしたら教えてください。 初心者の為、説明が分かり難かったら申し訳ありません。 よろしくお願いします。

みんなの回答

  • nakatyuu
  • ベストアンサー率20% (2/10)
回答No.3

いろいろ考慮もれがあるかも。 インデントは全角スペースを使用。 // サンプル try {  java.io.File inFile = new File("./inText.csv");  java.io.FileInputStream fis = new FileInputStream(inFile);    int size = Integer.MAX_VALUE;  if (Integer.MAX_VALUE >= inFile.length()) {   size = (int)inFile.length();  }    byte[] src = new byte[size];  byte[] readBuf = new byte[0];  while( fis.read(src) != -1) {   byte[] dest = new byte[readBuf.length + src.length];   System.arraycopy(readBuf, 0, dest, 0, readBuf.length);   System.arraycopy(src, 0, dest, readBuf.length, src.length);   readBuf = dest;  }  String readStr = new String(readBuf);  // 区切りは改行  String delim = "\r\n";  // 区切りを含むかどうか true:含む、false:含まない  boolean returnDelims = true;  java.util.StringTokenizer token = new StringTokenizer(readStr, delim, returnDelims);    while (token.hasMoreTokens()) {   // printlnではない。   System.out.print(token.nextToken());  } } catch (Exception e) {  e.printStackTrace(); }

すると、全ての回答が全文表示されます。
回答No.2

#1を使用するソース例 public static void main(String[] args) {   BufferedReader reader = null;   try {     reader = new BufferedReader(new FileReader(args[0]));     LineReader lineReader = new LineReader(reader, "\r\n");     for (int i = 0; true; i++) {       String line = lineReader.readLine();       if (line == null) {         break;       }       System.out.print("[" + i + "]");       System.out.println(line);     }   } catch (Exception e) {     e.printStackTrace();   } finally {     if (reader != null) {       try {         reader.close();       } catch (Exception e) {         e.printStackTrace();       }     }   } }

すると、全ての回答が全文表示されます。
回答No.1

うーん、標準のAPIでは対応できないかもしれませんねぇ。 なので、自前でユーティリティ・クラスを作ってみました。 public class LineReader {   /**    * 読込元の文字入力ストリーム。    */   private Reader reader;   /**    * 改行文字列。    */   private String lineFeed;   /**    * 文字入力ストリームから読み取った文字列を保持するバッファ。    */   private StringBuffer buffer;   /**    * 文字入力ストリームから読み込むときに一時的に利用する。    */   private char[] cbuf;   /**    * コンストラクタ。    * @param reader 読込元の文字入力ストリーム    * @param lineFeed 改行文字列    */   public LineReader(Reader reader, String lineFeed) {     this(reader, lineFeed, 1024);   }   /**    * コンストラクタ。    * @param reader 読込元の文字入力ストリーム    * @param lineFeed 改行文字列    * @param cbufSize ストリームから1回で読み取るサイズ。    */   public LineReader(Reader reader, String lineFeed, int cbufSize) {     this.reader = reader;     this.lineFeed = lineFeed;     this.buffer = new StringBuffer();     this.cbuf = new char[cbufSize];   }   /**    * 1行を読み取ります。    * @return 読み取った行。ストリームの終端まで来たらnull。    * @throws IOException 読み取りに失敗した場合。    */   public String readLine() throws IOException {     while (true) {       // 入力ストリームより前に、バッファに改行文字列がないか確認       int posOfLineFeed = buffer.indexOf(lineFeed);       // 改行文字列があれば、       // そこまでの部分文字列を戻す。       // 戻す前に、その部分文字列と当該改行文字列をバッファから除去して、       // 次回このメソッドが呼ばれたときに備える。       if (posOfLineFeed >= 0) {         String line = buffer.substring(0, posOfLineFeed);         buffer.delete(0, posOfLineFeed + lineFeed.length());         return line;       }       // 入力ストリームから読み取り。       int readLength = reader.read(cbuf);       // ストリーム終端まで到達していた場合、       if (readLength < 0) {         // バッファに残りがあれば、残りの文字列すべてを戻す。         if (buffer.length() > 0) {           String line = buffer.toString();           buffer.delete(0, buffer.length());           return line;         }         // バッファに残りがなければ、空文字列。         return null;       }              // 読み込んだ位置まで、バッファに移しておく。       for (int index = 0; index < readLength; index++) {         buffer.append(cbuf[index]);       }       // ループの選択に戻り、改行文字列検索から再スタート。     }   } }

すると、全ての回答が全文表示されます。

関連するQ&A