プロが教えるわが家の防犯対策術!

javaでcsvファイルを読込・データ登録処理を作成しているのですが、
現在はjavaのreadLine()を使用して読込んでいます。

既存のreadLine()では\rまたは\n、および\r\nにて改行とみなしているようですが、
これを\r\nの場合のみ改行としたいと思っています。
どなたか良い方法をご存知でしたら教えてください。

初心者の為、説明が分かり難かったら申し訳ありません。
よろしくお願いします。

A 回答 (3件)

うーん、標準の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]);
      }
      // ループの選択に戻り、改行文字列検索から再スタート。
    }
  }
}
    • good
    • 0

#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();
      }
    }
  }
}
    • good
    • 0

いろいろ考慮もれがあるかも。


インデントは全角スペースを使用。
// サンプル
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();
}
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A