質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

6016閲覧

Java言語でCSVファイルのフォーマット形式に変換したい

koukia

総合スコア5

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2015/06/27 11:44

編集2015/06/27 14:39

Java言語初心者です。
開発環境はeclipseでプログラミングをしています。

読み込んだファイルを5文字区切りでカンマを入れたいのですが、
実行するたびにフリーズが出て困っています。

int型のdata変数は210000の配列と
String型のcsvData変数は1000の配列を用意しています。
int型は適切だと思いますが、String型があまりよくわかっていないので、
適当に割り当てました。

ここが悪いなどの指摘をよろしくお願いします。

以下はソースの一部です

//ファイル変換クラス

public class csvConvert implements FileConverts{
private String fileName;
private int[] data;
private String[] csvData;

csvConvert(String fileName, int[] data, String[] csvData){ this.fileName = fileName; this.data = data; this.csvData = csvData; } public String[] convert(){ int cnt = 0; int i = 0; String tmp = ""; for(int c : data){ cnt++; tmp += c; if(cnt == 5){ System.out.print("a"); tmp += ","; csvData[i++] += tmp; cnt = 0; } } for(int a : data){ System.out.print((char)a); } return csvData; }

}

//追記 06/27 22:21
//ファイル読み込みクラス

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class Read implements FileRead{

private String fileName; private int data[]; Read(String fileName, int[] data){ this.fileName = fileName; this.data = data; } public int[] read(){ int c, i=0; int cnt = 0; try { BufferedReader br = new BufferedReader(new FileReader(fileName)); //最初の一行を捨てる br.readLine(); //最後までファイルを読み込む while((c = br.read()) != -1){ cnt++; //10文字目から文字を読み込む if(cnt > 9){ while((c = br.read()) != '\n'){ data[i++] = c; } data[i++] = '\n'; cnt = 0; } } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return data; }

}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

swordone

2015/06/27 12:48 編集

単にループが多すぎて処理に時間がかかっているだけ,という可能性はないですか?それと5文字ごと区切る対象は何なのかよくわかりません.
koukia

2015/06/27 13:24

06430061900615005980 このような数字の羅列を5文字ごとに区切りたいです。 大変遅くなりました。質問内容にファイル読み込みクラスのソースを追記いたしました。
swordone

2015/06/27 14:18 編集

ReadクラスとcsvConvertクラスはどういう関係で使うのですか?それと読み込むファイルの形式を教えて下さい
koukia

2015/06/27 14:32

ファイルの形式ですが、MEMファイルという数値標高データが入っているデータです。 ReadクラスはMEMファイルを読み込み、標高データのみ抜きとり、データに格納しています。 csvConvertクラスは読み込んだ標高データをカンマ区切りに切り分け、CSV形式に変換してデータに格納しようとしています。 ReadクラスでMEMファイルを読み込み→csvConvertクラスでcsv形式に変換→WriteクラスでCSVファイルに変換 という流れにしようとしています。
guest

回答2

0

ベストアンサー

おぼろげにやりたいことは伝わったのですが,それをするにはあまりにも無駄が多いように思います.
まず「ファイルから各行の10文字目以降を取り出す」という意味ならば

lang

1 StringBuilder builder = new StringBuilder(); //読みこんだ文字列全部詰め込む 2 3 BufferedReader br = new BufferedReader(new FileReader(fileName)); 4 br.readLine(); //1行読み捨て 5 String temp = null; 6 while((temp = br.readLine()) != null){ 7 builder.append(temp.substring(9)); //読み込んだ行の10文字目以降を文字列に足す 8 }

で全部文字列として扱えますし,その後の「5文字ごとカンマを打つ」作業も

lang

1 for(int i = 5; i < builder.length(); i += 6){ 2 builder.insert(i, ","); 3 }

で済みます.わざわざ長い配列を使っている意味がよくわかりませんし,一文字ずつ,しかもUnicode整数を読み込んでいる意図が謎です.

投稿2015/06/27 11:49

編集2015/06/27 14:49
swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

koukia

2015/06/27 15:09

swordoneさんのソースを見て、確かに私のソースの無駄がわかりました。! 文字を区切るには1文字ずつ読み込むしかないと思っていたので、非常に参考になります。フリーズ等が起きた原因は、csvData変数やtmp変数のヒープ領域が足りないとかが原因でした。まだまだ無駄が多いので、swordoneさんのソースを参考にして、勉強していきたいと思います。 本当に夜遅くまでありがとうございました。
swordone

2015/06/27 15:52

文字列を扱うStringクラス,文字列の構成を行うStringBuilder/StringBufferは使いこなせれば便利なのでぜひ調べて下さい.
swordone

2015/06/28 08:01

ついでに } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } どっちもやることが同じなら,FileNotFoundExceptionもIOExceptionとしてcatchできるので(前者が後者のサブクラス),FileNotFoundExceptionの方はなくてもいいと思います.
guest

0

テキストファイルの変換の基本は

  • ファイルから行単位で read して、その行を別ファイルに write する。

です。

その例としてはこんなものが見つかります。

ここでは、2 番目のサイトの Strem をつかった例をベースに作成してみました。
(MacOSX で実施してます。)

lang

1// See http://stackoverflow.com/questions/28504504/modify-file-using-files-lines 2import java.io.FileNotFoundException; 3import java.io.IOException; 4import java.io.PrintWriter; 5import java.nio.file.Files; 6import java.nio.file.Paths; 7import java.util.ArrayList; 8import java.util.List; 9import java.util.stream.Stream; 10 11public class ConvertTextFile { 12 13 public static void main(String[] args) throws FileNotFoundException, IOException { 14 15 try (Stream<String> input = Files.lines(Paths.get("input.txt")); 16 PrintWriter output = new PrintWriter("output.txt", "UTF-8")) { 17 input.map(s -> convert(s)) 18 .forEachOrdered(output::println); 19 } 20 } 21 22 static String convert(String s) { 23 // 5 文字毎に分割して "," でつなげる。 24 final int len = s.length(); 25 List<String> items = new ArrayList<>(); 26 for (int i = 0; i < len; i += 5) { 27 int item_len = (i + 5 < len) ? 5 : (len - i); 28 items.add(s.substring(i, i + item_len)); 29 } 30 return String.join(",", items); 31 } 32}

実行例:

$ rm output.txt remove output.txt? y $ cat input.txt A2345678901234567890 B234567890123456789 C23456789012345678 Dいうえおあいうえおあいうえおあいうえお Eいうえおあいうえおあいうえおあいうえ Fいうえおあいうえおあいうえおあいう Gいうえおあいうえおあいうえおあい Hいうえおあいうえおあいうえおあ Iいうえおあいうえおあいうえお $ java ConvertTextFile $ cat output.txt A2345,67890,12345,67890 B2345,67890,12345,6789 C2345,67890,12345,678 Dいうえお,あいうえお,あいうえお,あいうえお Eいうえお,あいうえお,あいうえお,あいうえ Fいうえお,あいうえお,あいうえお,あいう Gいうえお,あいうえお,あいうえお,あい Hいうえお,あいうえお,あいうえお,あ Iいうえお,あいうえお,あいうえお

投稿2015/06/28 01:14

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

koukia

2015/06/28 03:49

回答ありがとうございます! 参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問