• 締切済み

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

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

  • Java
  • 回答数3
  • ありがとう数2

みんなの回答

  • 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

  • csvファイルの読み込みができません。

    csvファイルの読み込みができません。 過去にExcelで作成したデータをcsvに変換するマクロを作ってもらいました。 (Excel表の中にマクロを登録したボタンがあって、それをクリックするとcsvファイルが作成される) そのcsvファイルをそのまま使用すると、読み込みができますが、一旦csvファイルを開いて一部データの変更をして保存すると読み込みができなくなります。 また、自動にファイル名が設定されるので、わかりやすいようにファイル名を変更しただけでも読み込みができなくなります。 csvファイルにも種類があるんでしょうか?

  • CSVファイルの読み込み

    ASPの勉強をしています。 CSVファイルを読み込んでDBに登録していきたいのですが、 111,222,"aaa[改行]bbb","1,000",444,555 のようなデータがあったとすると、 「1,000」の桁区切りのカンマのせいで、 「1」 と 「000」に別れてしまいます。 これを防ぐプログラムを作りたいのですが、 わかる方よろしくお願いします。 現在はReadLineで1行ずつ読み込んでいます。 set ObjFS = CreateObject("Scripting.FileSystemObject") set Stream = ObjFS.OpenTextFile(Server.MapPath(FILENAME,1,false,0) ReadBuf = Stream.ReadLine

  • csvファイル改行コードの置換について

    お世話になります。 csvファイルで作成したデータを出力表示させるスクリプトで csvファイル内の改行コード(セル内)以後のデータが出力できません。 下記の置換で改行コード以後のデータが表示されません。 $abc =~ s/\r\n//g; $abc =~ s/\n//g; $abc =~ s/\r//g; csvファイル内の改行の数が多く、1行のデータが改行の為に、2行になったりしているので出力前に置換し表示させる方法です。 csvファイル作成時につく""は正常に置換しています。 似たような質問もあったのですが、少し違うようですので質問いたしました。 何卒、ご教授お願いいたします。

    • ベストアンサー
    • Perl
  • Excelとcsvの改行について

    初めまして。 新規でネットショップをオープンすべく準備中の、HTML初心者です。 実店舗の経験をネットで生かそうと思い、分からないことが出てくる度に調べながらオープン準備を進め、何とか残るは商品データのUPのみという所まできました。 ショップサーブからダウンロードした一括UP用のcsvファイルがExcelで開いたので何の疑問も持たなかったのですが、保存時にエラーがでたため調べたところ、Excelの改行はcsvには反映されないことを知りました。 さらに調べて、改行したい部分に\r\n(Macは\n)もしくは、"文章"と入力すると改行が反映される。というところまで辿り着いたのですが、下記の内容で詰まっております。 (1)既に200近い商品データをExcelに入力済みです。入力済データの改行部分を、コマンド(コード?)に一括変換する方法はあるのでしょうか。 (2)例えば、文章の上下間を3行空ける(改行する)場合、入力は文章\r\n\r\n\r\n文章(Macは文章\n\n\n文章)もしくは、"文章"",",""文章"で良いのでしょうか。 (3)試しにネット上で入力した商品データ(csvファイル)をダウンロードして開くとExcelが起動し、ネット上で改行した部分が幾つものスペースで表示されます。データを壊さずにスペースを短くする方法はあるのでしょうか。 お手数ではございますが、宜しくお願い致します。

  • 【VB6】項目内に改行コードを含むCSVファイルの読み込み

    いつもお世話になっております。 現在VB6.0にて、CSVファイルを読み込む処理をしています。 ・ファイル読み込みにて1行ファイルを読み込む。 ・Split関数で「,」で区切って項目ごとに配列に保持する。 というロジックで作成しているのですが、 項目内に改行コードが存在する場合にうまく読み込めません。 (1行ずつ読んでるので当然ですが…) 項目内のコードをLF、実際の行の改行をCR+LFで区別すると読み込む のは分かるのですが、項目内の改行コードがCR+LFの場合でも、 正しく読み込みたいです。 以上です。よろしくお願い致します。

  • Linuxで作成したCSVをExcelVBAで読込時の改行コードについて

    ※重複した質問があったら、すみませんm(_)m とっても困っています。教えてください。 Linuxで作成したCSVをExcelVBAで読込時、 前行の改行コード(LF)が、次の行頭のデータに 連結されてしまいます。 どうすれば、この問題を解決できますか? OSは、WindowsXP、EXCELは2000です。 よろしくお願いします。

  • (VBS) テキストファイル読込での改行コード

    VBAからVBスクリプトへの移植作業をしています。 テキストファイル中に改行コード \r\n と \n が混在しているのですが、 \r\n までを1行として取得したいです。 VBAだと Line Input で取得できたのですが、 VBScriptの場合、FileSystemObject.OpenTextFileで開き .ReadLine で読み込むことになりますが、 ReadLineは \n も行の終端とされてしまい、本来1行のデータが複数行に分かれて読み込まれてしまいます。 .ReadAllで一旦すべてを取得してから Split("\r\n") で分割するという方法は ファイルサイズが膨大だと負荷が掛かるので避けたいです。 \n は、これはこれでデータとして必要なので、削除することはできません。 負荷が掛からず、良い方法があればご教授頂きたく思います。 よろしくお願い致します。

  • CSVファイルの改行

    似たような質問はあったのですが、解決できませんでした。 複数のテーブル(mysql)から抽出したデータをCSVファイルにして ダウンロードという動きを作りましたが、Excelでは改行されているのに メモ帳だと改行されません。 配列の最後に"\r\n"を挿入してみたところ、メモ帳での改行はできたのですが、 Excelに必要ない改行が入ってしまいます。(あたりまえですよね) 改行コードの入れるタイミングと方法を教えて頂けますか。 select文 while($rows = @mysql_fetch_array($result)){ $list[$i] = array ($aaa,$bbb,$ccc); $i++; } $filename = 'ファイル名'; $fp = fopen($filename.'.csv', 'w'); foreach ($list as $line) { fputcsv( $fp , $line ); } fclose($fp); ZIP圧縮処理後ダウンロード 環境:php5,mysql5

    • 締切済み
    • PHP
  • CSV出力時の改行コードについて

    こんにちは。 現在、PHPからCSVファイルを出力する処理を作成しています。 そこで改行文字を"\n"にしてCSVファイルを出力してExcelで 開くと改行されておりますがノートパッドで開くと改行されて いませんでした。 ノートパッドでも改行される作りにしたい場合はどのように すればよろしいでしょうか? 宜しくお願いします。

    • ベストアンサー
    • PHP
  • 改行のあるCSVファイルをExcelに読み込みたい

    CSVファイルをExcelにインポートしたいのですが CSVファイルのデータ内に改行が入っていたので、レイアウトが崩れて、 うまくExcelにインポートできない状態です。 改行を置き換えで取り除くと、すべて横並びになってしまいます。 1レコードは59項目と決まっているのですが、手作業で改行を入れるのは 数が多く難しそうです。 なんとかうまく取り込む方法はないでしょうか? プログラミングは全くわかっていない初心者ですが、 エクセルのVBAにコピペして実行することは可能です。。。 カテ違いだったらすみません><

専門家に質問してみよう