• 検索結果がありません。

目 次 Java 入 門 5 1 はじめに ファイルを 書 き 出 すために 使 うクラス テストファイルを 書 く 手 順 テキストファイルを 書 くための 概 略 手 順 File インスタンスを 作 成 する

N/A
N/A
Protected

Academic year: 2021

シェア "目 次 Java 入 門 5 1 はじめに ファイルを 書 き 出 すために 使 うクラス テストファイルを 書 く 手 順 テキストファイルを 書 くための 概 略 手 順 File インスタンスを 作 成 する"

Copied!
35
0
0

読み込み中.... (全文を見る)

全文

(1)

Copyright(c) 2010 Kyosuke Yanai

Java 入門 【5】

ファイルを書く

-2010-09-23 Version 1.0

(2)

目 次 1 はじめに...1 1.1 ファイルを書き出すために使うクラス...1 2 テストファイルを書く手順...2 2.1 テキストファイルを書くための概略手順...2 2.1.1 File インスタンスを作成する...2 2.1.2 テキストファイルを作成する...2 2.1.3 PrintWriter インスタンスを作成する ...3 2.1.4 テキストファイルの内容を書き出す...3 2.1.4.1 print メソッド ...4 2.1.4.2 println メソッド...4 2.1.4.3 printf メソッド...5 2.1.4.4 書式文字列...5 2.1.4.5 printf の使用例...6 2.1.5 close()メソッドを呼び出して、テキストファイルを閉じる ...7 3 テキストファイル書き込みプログラムを作成...8 3.1 プログラムの概要...8 3.2 ソースコード例...8 3.3 eclipse でクラスを作成 ...10 4 テキストファイル読み込みプログラムを実行... 11 4.1 ディレクトリの作成... 11 4.2 実行... 11 5 テキストファイルの読み込みと書き込み... 12 5.1 String クラスのメソッド...12 5.1.1 文字列の比較...12 5.1.2 文字列の検索...13 5.1.3 文字列の抽出・編集...17 5.1.3.1 正規表現の概要...19 6 テキストファイルの読み込みと編集出力... 22 6.1 クラス構成...22 6.2 ソースコード...23 6.3 eclipse でクラスを作成、実行 ...28 7 演習... 29 7.1 CSV ファイルの読み込みと編集出力...29 7.2 2 つの CSV ファイルの読み込みと編集出力 ...29

(3)

8 付録... 30

8.1 TBD...30

9 改定履歴... 31

(4)

1

はじめに

本テキストでは、テキストファイルを書く方法を学びます。また、テキストファイルを読み、内 容を抽出・変換して、別のファイルに書き出すこともやってみます。 これに関連して以下のことも学びます。  File クラス  PrintWriter クラス  String クラスの主なメソッド  正規表現 1.1 ファイルを書き出すために使うクラス テキストファイルを書くのによく使われるクラスをリストします。 Java のさまざまなクラスの仕様の詳細は、下記のサイトに載っていますのでご覧ください。 http://java.sun.com/javase/ja/6/docs/ja/api/index.html (1) File クラス(正式名 = java.io.File) ファイルとディレクトリを扱うためのクラスです。このクラスを使って、ディレクトリの作 成、ディレクトリ配下のファイルの一覧、パスの処理などを行います。 このクラスだけでは、ファイルの内容を読んだり書いたりすることはできません。 (2) FileWriter クラス(正式名 = java.io.FileWriter) テキストファイルを書くための基本的な機能を持ったクラスです。 (3) BufferedWriter クラス(正式名 = java.io.BufferedWriter) FileWriter に newLine()メソッドが追加されたクラスです。 (4) PrintWriter クラス(正式名 = java.io.PrintWriter) System.out と同じような感覚で使用できるメソッド(println など)を持ったクラスです。 本テキストでは、PrintWriter クラスを使用します。

(5)

Copyrgiht(c) 2010 Kyosuke Yanai

2

テストファイルを書く手順

ここでは、テキストファイルを書く基本的な手順を学びます。 先に説明した、File、PrintWriter クラスを使用します。 2.1 テキストファイルを書くための概略手順 テキストファイルを書くための概略手順を図に示します。 図 2-1 テキストファイルに内容を書き出す概略手順 各ステップについて詳しく説明します。 2.1.1 File インスタンスを作成する File クラスのコンストラクタに、ファイルパスを指定します。 図 2-2 (1) File インスタンスを作成する 2.1.2 テキストファイルを作成する File の createNewFile()メソッドで新たにファイルを作成します。 (1) ファイルパスを指定して File インスタンスを作成する (3) File インスタンスを指定して PrintWriter インスタンス を作成する (4) PrintWriter の println()などのメソッドを使って、テキ ストを書く (5) PrintWriter の close()メソッドを呼び出して、テキスト ファイルを閉じる。 (2) File の createNewFile()メソッドで新たにファイルを作 成する String filePath = "ファイルパス"; File file = new File(filepath);

(6)

図 2-3 (2) 新たにファイルを作成する

【createNewFile】

 宣言: public boolean createNewFile() throws IOException  引数: なし  機能: File インスタンスが持つパス名の空(から)の新しいファイルを生成します。  戻り値: true - ファイルの生成に成功した場合 false - 示されたファイルがすでに存在する場合  例外: IOException - 入出力エラーが発生した場合 2.1.3 PrintWriter インスタンスを作成する PrintWriter クラスのコンストラクタに、生成した File インスタンスを指定します。 図 2-4 (3) PrintWriter インスタンスを作成する 2.1.4 テキストファイルの内容を書き出す PrintWriter クラスには、テキストを書き出すために色々なメソッドが備わっています。 よく使われるメソッドを紹介します。 表 2-1 PrintWriter クラスの主なメソッド メソッド 概要 print() 文字列、数値などを書き出します。 println() 文字列、数値などを書き出し、行を終了させます。 printf() 書式付き文字列を書き出します。 format() 書式付き文字列を書き出します。 【書式付き文字列】 文字列を表示/出力するときに、その文字列の中に、日付や金額などの値を含めたいことが あります。数値を文字列にして表示/出力するのですが、頭に金額の"¥"をつけたり、3桁ご とに","(カンマ)を付けたり、といったことをします。 このように、文字列に数値などを文字列に変換する場合、どのような文字列に変換するかを 示すものを「書式」といいます。その書式を含んだ文字列を「書式付き文字列」といいます。 具体的には、このあと見ていきましょう。

PrintWriter pw = new PrintWriter(file); file.creaeNewFile();

(7)

Copyrgiht(c) 2010 Kyosuke Yanai 各メソッドの仕様を少し詳しく見てみましょう。なお、printf()と format()はほとんど同 じ役割をしますので、ここでは、format メソッドの詳細は省略します。 2.1.4.1 print メソッド 引数によって機能が異なる同名のメソッドがあります。ここでは主なものを紹介します。 【print】boolean

 宣言: public void print(boolean b)  引数: boolean 型

 機能: boolean 型の値(true/false)を出力します。  戻り値: なし。

【print】int

 宣言: public void print(int i)  引数: int 型

 機能: 整数型の値を出力します。  戻り値: なし。

【print】String

 宣言: public void print(String s)  引数: String 型  機能: 文字列を出力します。 戻り値: なし。 2.1.4.2 println メソッド print メソッドの動作に、行の終了が追加されます。 print()を使った場合と println()を使った場合の違いは次のようになります。 図 2-5 print()と println()の違い pw.print("ABC"); pw.print("DEF"); pw.print("GHI"); print() println() pw.println("ABC"); pw.println("DEF"); pw.println("GHI"); ABCDEFGHI ABC DEF GHI 出力結果 出力結果 ※pw は PrintWriter のインスタンスを参照しているものとします。

(8)

println()では、改行されているのがわかりますね。

2.1.4.3 printf メソッド 書式付き文字列を書き出します。

【printf】

 宣言: public PrintWriter printf(String format, Object... args)  引数: format 書式付き文字列 (String 型) args オブジェクト 省略可能です。また、複数個の指定ができます。  機能: 書式付き文字列を出力します。このとき、args で指定したオブジェクトを文字 列に変換して出力します。  戻り値: PrintWriter 自身  例外: IllegalFormatException 書式文字列が正しくないときにスローされます。 printf でサポートしている書式付き文字列は豊富ですが、比較的よく使われるものを紹 介します。 2.1.4.4 書式文字列 書式を構成する文字列は次のような形式をとります。 【書式文字列】 %[argument_index$][flags][width][,presision]conversion (1) % 書式文字列は、"%"(パーセント)で始まります。 (2) argument_index$ 引数args の何番目の引数を表示対象とするかを示します。 たとえば、 1$は、引数 args の最初の引数を示します。 同様に、2$, 3$, 4$, ... と記述します。 なお、args の引数がひとつだけの場合には、argument_index$は不要です。 (3) flags 対象の引数の表示をどう変更するかを指定します。 "-" : 左そろえします。 "+" : 符号( + か - ) を付与します。 "0" : "0"(ゼロ)で埋めます。 "," : ","(カンマ)を付与します。 "(" : マイナスを"(" と")" の括弧でくくります。 (4) width 出力する最小の文字数を指定します。 (5) ,presision

(9)

Copyrgiht(c) 2010 Kyosuke Yanai 引数が浮動小数点(float)の場合にだけ有効です。小数点の右の桁数を指定します。 (6) conversion 対象とする引数のデータ型を示します。 "b" : boolean "c" : 文字型 "d" : 整数型 "f" : 不動小数点型 "s" : 文字列型 2.1.4.5 printf の使用例 printf の使用例をいくつか載せます。引数は整数型を使用しています。 (1) 書式文字列 %d 整数型の引数がひとつのときに使用できます。 (例-1) ・記述 int arg = 456789; pw.printf("引数の値は、%d です。", arg); ・実行結果 引数の値は、456789 です。 (2) 書式文字列 %1$d %2$d 整数型の引数が2つのときに使用できます。 (例-2) ・記述 int number = 15; int value = 123456;

pw.printf("%1$d 番目の値は、%2$d です。", number, value); ・実行結果 15 番目の値は、123456 です。 (3) 書式文字列 %+d 整数型の引数に、符号を付与して出力します。 (例-3) ・記述 int value = 123456;

(10)

pw.printf("データの値は、%+d です。", value); ・実行結果 データの値は、+123456 です。 (4) 書式文字列 %,d 整数型の引数をカンマ付きで出力します。 (例-4) ・記述 int population = 410341; pw.printf("藤沢市の人口は、%,d 人です。", population); ・実行結果 藤沢市の人口は、410,341 人です。 2.1.5 close()メソッドを呼び出して、テキストファイルを閉じる PrintWriter の close()メソッドを呼び出して、テキストファイルを閉じます。 【close】

 宣言: public void close()  引数: なし。

 機能: PrintWriter を閉じます。  戻り値: なし。

(11)

Copyrgiht(c) 2010 Kyosuke Yanai

3

テキストファイル書き込みプログラムを作成

では、これまでの内容を元に、テキストファイル読み込みプログラムを作成しましょう。 本テキストに基づいて先に作成したサンプルの jp.lites.study.java パッケージが残ってい る場合は、パッケージ作成までの作業をスキップしてください。 3.1 プログラムの概要 以下のようなプログラムを作ってみましょう。出力内容はお好きなように書いてみてくださ い。 プロジェクト名: java_05 パッケージ名 : jp.lites.study.java クラス名: WriteSample 出力するテキストファイルパス: c:¥tmp¥sample.txt 出力内容: Java 入門 【5】 ファイルを書く サンプルプログラムです。 ・・・・・・・お好きなように書いてみてください。 以上です。 【注意】出力するテキストファイル名は、すでに存在しているファイルではないようにしましょう。 思いがけずに重要なテキストファイルを壊してしまわないように、十分注意しまょう。 3.2 ソースコード例 ソースコード例を示します。 リスト 3-1 WriteSample.java line WriteSample.java 1 2 3 4 5 6 7 8 9 10 11 package jp.lites.study.java; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.PrintWriter;

public class WriteSample {

(12)

line WriteSample.java 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 32 32 33 34 35 36 37 38 39 40 41 42 43

String filePath = "c:/tmp/sample.txt"; File file = new File(filePath);

try {

file.createNewFile();

PrintWriter pw = new PrintWriter(file); pw.println("Java 入門 【5】 ファイルを書く"); pw.println("サンプルプログラムです。"); int population = 410341; pw.printf("藤沢市の人口は、%,d 人です。¥n", population); pw.println("以上です。"); pw.close(); System.out.println("ファイルを作成しました。"); } catch (FileNotFoundException e) { System.out.println("ファイルを生成できません。"); e.printStackTrace(); } catch (IOException e) { System.out.println("ファイルの書き込みでエラーが発生しました。"); e.printStackTrace(); } } } 【12行目】作成するテキストファイルのパスを、"c:/tmp/sample.txt"とします。 【14行目】File インスタンスを生成します。 【17行目】新たにファイルを生成します。

(13)

Copyrgiht(c) 2010 Kyosuke Yanai 【19行目】file を指定して PrintWriter インスタンスを生成します。 【21~27行目】PrintWriter のメソッドを使用して、テキストを書き出します。 【29行目】PrintWriter を close します。 【33~39行目】例外をキャッチし、メッセージを表示します。 3.3 eclipse でクラスを作成 上記のクラスをeclipse で作成してください。 作成したら、休憩しましょう。

(14)

4

テキストファイル読み込みプログラムを実行

では、作成したプログラムを実行して、テキストファイルを作成してみましょう。 4.1 ディレクトリの作成 実行する前に下記のディレクトリを作成しておきましょう。 作成ディレクトリ: c:¥tmp 4.2 実行 eclipse での実行結果の例を示します。 図 4-1 WriteSample 実行結果 作成されたテキストファイルを見てみましょう。図に例を示します。 図 4-2 作成されたテキストファイル

(15)

Copyrgiht(c) 2010 Kyosuke Yanai

5

テキストファイルの読み込みと書き込み

これまでに作成したサンプルは、単に決まりきった文字列をテキストファイルに書き出すだ けでした。 実際には、あるテキストファイルを読んで、その内容を編集の上、別のファイルに書き出す、 ということがよくあります。ここでは、そのような例をやってみましょう。 テキストファイルを読むことと、書くことの基礎は学びました。ここでは、文字列の編集に ついて学びましょう。 5.1 String クラスのメソッド 文字列を扱う基本的なクラスは、String クラスです。String クラスには、じつにさまざまな メソッドがあります。次に、主なメソッドを紹介します。 5.1.1 文字列の比較 二つの文字列が同一かどうかを調べるメソッドとしてequals()メソッドがあります。 【equals】

 宣言: public boolean equals(Object anObject)

 引数: anObject - String と比較するオブジェクト(通常は String オブジェクトを指定 します)  機能: String オブジェクト(の文字列)と指定されたオブジェクト(の文字列)を比較し ます。  戻り値: true - String オブジェクトと指定されたオブジェクトとが同じ文字列であ る場合 false - String オブジェクトと指定されたオブジェクトとが異なる文字列であ る場合 記述例を示します。 図 5-1 equals メソッドの記述例 String line = null;

String aString = "終了"; line = bReader.readLine(); //テキストファイルから読み込んだ行データ if ( aString.equals(line) ) { // 文字列が一致 } else { //文字列が不一致 }

(16)

【NOTE】 if ( aString == line ) ではだめなのでしょうか。 この場合には、aString と line 変数が、「同じオブジェクトを参照しているかどうか」を判断 します。ですから、aString と line の文字列が同じであっても、別のオブジェクトを示してい ますから、false になってしまいます。 図 5-2 == と equals の違い 5.1.2 文字列の検索 String オブジェクトが持つ文字列の中から、指定の文字/文字列を検索するメソッドがい くつかあります。 【startsWith】

 宣言: public boolean startsWith(String prefix)  引数: prefix - 検索する文字列を指定します。

 機能: String オブジェクト(の文字列)が、指定された文字列で始まるかどうかを判定 します。

 戻り値: true - String オブジェクト(の文字列)が指定された文字列で始まる場合 false - String オブジェクト(の文字列)が指定された文字列で始まらない場合

aString == line ---> true aString.eauals(line) ---> true aString line "終了" aString line "終了" ケース A

aString == line ---> false aString.eauals(line) ---> true ケース B "終了" aString line "終了" aString == line ---> false

aString.eauals(line) ---> false ケース C "Java 入門" String オブジェクト String オブジェクト String オブジェクト

(17)

Copyrgiht(c) 2010 Kyosuke Yanai 記述例を示します。

図 5-3 startsWith メソッドの記述例

【endsWith】

 宣言: public boolean endsWith(String suffix)  引数: suffix - 検索する文字列を指定します。  機能: String オブジェクト(の文字列)が、指定された文字列で終了するかどうかを判 定します。  戻り値: true - String オブジェクト(の文字列)が指定された文字列で終了する場合 false - String オブジェクト(の文字列)が指定された文字列で終了しない場合 記述例を示します。 図 5-4 endsWith メソッドの記述例 【contains】

 宣言: public boolean contains(CharSequence s)

 引数: s - 検索する文字列(を持つオブジェクト)を指定します。  機能: String オブジェクト(の文字列)が、指定された文字列を含むかどうかを判定し ます。  戻り値: true - String オブジェクト(の文字列)が指定された文字列を含む場合 false - String オブジェクト(の文字列)が指定された文字列を含まない場合  例外: NullPointerException - s が null の場合 【NOTE】CharSequence は、具体的には String などです。 String filePath = "c:/tmp/sample.txt";

if (filePath.startsWith("c:")) {

System.out.println("c ドライブです。"); } else {

System.out.println("c ドライブではありません。"); }

String filePath = "c:/tmp/sample.txt"; if (filePath.endsWith(".txt")) {

System.out.println("テキストファイルです。"); } else {

System.out.println("テキストファイルではありません。"); }

(18)

記述例を示します。

図 5-5 contains メソッドの記述例

【indexOf】

 宣言: public int indexOf(String str)  引数: str - 検索する文字列を指定します。  機能: String オブジェクト(の文字列)が、指定された部分文字列が最初に出現する位 置のインデックスを返します  戻り値: インデックス値- 引数で指定した文字列がこの String オブジェクト内にあ る場合は、最初の部分文字列の最初の文字のインデックス -1 - String オブジェクト(の文字列)が指定された文字列を含まない場合 【NOTE】(文字列の)インデックスは、文字列内の各文字の位置を示し、0 から始まる値で す。このindexOf()メソッドで取得したインデックスを使って、後述の substring()メソッドを 使って文字列を抽出することができます。 記述例と実行結果例を示します。 図 5-6 indexOf メソッドの記述例 【NOTE】文字列内に "(ダブルコーテーション) を含めたいときには、¥" と書きます。 String address = "神奈川県藤沢市藤沢 1-1"; if (address.contains("藤沢市")) { System.out.println("藤沢市です。"); } else { System.out.println("藤沢市ではありません。"); } String address = "神奈川県藤沢市藤沢 1-1"; int index = address.indexOf("藤沢"); if (index > 0) { System.out.println("最初の¥"藤沢¥"のインデックス = " + index ); } else { System.out.println("¥"藤沢¥"を含みません。"); } 最初の"藤沢"のインデックス = 4 実行結果例

(19)

Copyrgiht(c) 2010 Kyosuke Yanai 【lastIndexOf】

 宣言: public int lastIndexOf(String str)  引数: str - 検索する文字列を指定します。  機能: String オブジェクト(の文字列)が、指定された部分文字列が最後に出現する位 置のインデックスを返します  戻り値: インデックス値- 引数で指定した文字列がこの String オブジェクト内にあ る場合は、最後の部分文字列の最初の文字のインデックス -1 - String オブジェクト(の文字列)が指定された文字列を含まない場合 【NOTE】(文字列の)インデックスは、文字列内の各文字の位置を示し、0 から始まる値で す。このindexOf()メソッドで取得したインデックスを使って何をするかは、後で学びます。 記述例を示します。 図 5-7 lastIndexOf メソッドの記述例 【NOTE】ここで示した文字列のインデックスを図で確認しておきましょう。 図 5-8 文字列のインデックス String address = "神奈川県藤沢市藤沢 1-1";

int index = address.lastIndexOf("藤沢"); if (index > 0) { System.out.println("最後の¥"藤沢¥"のインデックス = " + index ); } else { System.out.println("¥"藤沢¥"を含みません。"); } 最後の"藤沢"のインデックス = 7 実行結果例 最後の"藤沢"のインデックス = 7 インデックス 神 奈 川 県 藤 沢 市 藤 沢 1 - 1 文字列 0 1 2 3 4 5 6 7 8 9 10 11 最初の"藤沢"のインデックス = 4

(20)

5.1.3 文字列の抽出・編集

String オブジェクトが持つ文字列の中から文字列を抽出したり、文字列を編集するメソ ッドもあります。

【concat】

 宣言: public String concat(String str)  引数: str - 文字列を指定します。  機能: String オブジェクト(の文字列)の最後に、指定された文字列を連結します。  戻り値: String- 連結した文字列を表す新しい String オブジェクト 記述例と実行結果例を示します。 図 5-9 concat メソッドの記述例 【trim】

 宣言: public String trim()  引数: なし。  機能: String オブジェクト(の文字列)の先頭と最後の空白を省略した文字列を生成し ます。  戻り値: String-先頭と最後の空白を省略した文字列を表す新しい String オブジェ クト 記述例と実行結果例を示します。 図 5-10 trim メソッドの記述例 String title = "住所: "; String address = "神奈川県藤沢市藤沢 1-1"; System.out.println( title.concat(address) ); 住所: 神奈川県藤沢市藤沢 1-1 実行結果例 String address = " 神奈川県藤沢市藤沢 1-1 "; System.out.println("住所は" + address + "です。"); System.out.println("住所は" + address.trim() + "です。"); 住所は 神奈川県藤沢市藤沢1-1 です。 住所は神奈川県藤沢市藤沢 1-1 です。 実行結果例

(21)

Copyrgiht(c) 2010 Kyosuke Yanai 【substring】

 宣言: public String substring(int beginIndex)  引数: beginIndex - 開始インデックス  機能: String オブジェクト(の文字列)の指定されたインデックスで始まり、この文字 列の最後までの文字列を生成します。  戻り値: 部分文字列を表す新しい String オブジェクト 記述例と実行結果例を示します。たとえば、開始インデックスに、先のindexOf()メソッ ドで取得したインデックスを使うことができます。 図 5-11 substring メソッドの記述例 【split】

 宣言: public String[] split(String regex)  引数: regex -区切り文字/文字列の正規表現  機能: String オブジェクト(の文字列) を指定された正規表現に一致する位置で分割 します。  戻り値: String オブジェクト(の文字列)を指定された正規表現に一致する位置で分割 された文字列の配列  例外: PatternSyntaxException - 正規表現の構文が無効な場合 記述例と実行結果の例を見る前に、ここで示されている「正規表現」について簡単に学 んでおきましょう。 String address = "神奈川県藤沢市藤沢 1-1"; int index = address.indexOf("藤沢市"); if (index > 0) { System.out.println("住所は市内、" + address.substring(index + 3) + "です。"); } else { System.out.println("住所は市内ではありません。"); } 住所は市内、藤沢 1-1 です。 実行結果例

(22)

5.1.3.1 正規表現の概要

正規表現とは、いくつかの文字列の集まりを一つの文字列形式で表現するための方法で す。

特に、文字列の中から部分文字列を検索する場合によく用いられます。たとえば、次の 文字列を見てください。

no, name, tel, mail

100011, K.Sato, 090-9876-5432, [email protected] 100023, S.Tanaka, 090-1234-5678, [email protected] 100052, H.Watanabe, 03-111-9876, [email protected] これらは、従業員番号、氏名、電話番号、メールアドレスのデータと考えましょう。こ れらの文字列データの中から、氏名だけを見つけるとか、メールアドレスだけを見つけ るような場合、検索文字列をどう表現したらよいでしょうか。 そのような場合、見つけたい文字列がどんな文字で構成されているか、という点に着目 して、その文字列のパターンのようなものを表現できたら便利ですね。 たとえば、次のようなパターンで区別できないでしょうか。 (1) 従業員番号は、数字だけで構成されて、しかも、6 桁と決まっている。 (2) 氏名は、英文字、"."(ドット)、英文字の順に構成されている。 (3) 電話番号は、数字と "-"(ハイフン)で構成されている。 (4) メールアドレスは、英文字列と"."(ドット)が"@"(アットマーク)でつながっている。 まずは、よく使われる基本的な文字のパターンを見ておきましょう。これらのパターン を構成する要素として、「メタキャラクタ」が用意されています。「メタキャラクタ」は、 文字や数字の種類、文字の位置、文字数などを表現するための特殊な文字列です。 代表的なメタキャラクタを表に示します。 表 5-1 文字や数字の種類を示すメタキャラクタ メタキャラクタ 意味 ¥d 数字1 文字 ¥s 任意の空白文字(スペース、タブ、改行、復帰)1 文字 ¥w 任意の英数字と_(アンダースコア: underscore) 1 文字 [文字セット] 文字セットのいずれかの文字1文字 ※文字セットを使った例 [0-9] 数字 0-9 の任意 1 文字 [a-z] 英小文字 a-z の任意 1 文字 [A-Z] 英大文字 A から Z の任意 1 文字 [ABC] A, B, C いずれかの文字1文字

(23)

Copyrgiht(c) 2010 Kyosuke Yanai 表 5-2 文字の位置を示すメタキャラクタ メタキャラクタ 意味 ^ 行頭 $ 行末 ※(例) ^a 行頭の a z$ 行末の z 表 5-3 文字数を示すメタキャラクタ メタキャラクタ 意味 * 直前の文字が0 個以上 + 直前の文字が1 個以上 ? 直前の文字が0 個か 1 個 {n} 直前の文字がn 個 ※文字や数字の種類を示すメタキャラクタの直後に、文字数を示すメタキャラクタを使用し ます。 (例) [a-zA-Z]+ 1文字以上の英字 [0-9]{7} 7 桁の数字 さて、上の例に戻りましょう。パターンの例を考えてみましょう。あくまでも例ですの で、次に示したパターン以外も考えられます。 (1) 従業員番号は、数字だけで構成されて、しかも、6 桁と決まっている。 パターン: [0-9]{6} (2) 氏名は、英文字、"."(ドット)、英文字の順に構成されている。 パターン: [a-zA-Z]+.[a-zA-Z]+ (3) 電話番号は、数字と "-"(ハイフン)で構成されている。 [0-9]+-[0-9]+-[0-9]+ (4) メールアドレスは、英文字列と"."(ドット)が"@"(アットマーク)でつながっている。 [a-zA-Z]+@[a-zA-Z.]+ 正規表現はなかなか奥深く、それだけで一冊の本になるほどですが、実用面では比較的 簡単なパターンの使用で問題が解決することが多いので、あまり深刻にならずとも、良

(24)

いと思います。 さて、split()メソッドに戻り、spilit()メソッドの記述例と実行例を見てみましょう。 この例では、引数に ","(カンマ)を指定していますので、図のように String 配列が生成さ れます。 図 5-12 split メソッドの記述例 さんざん正規表現のことを言っておきながら、split()メソッドの記述例と実行例は、実に 簡単で、正規表現を使っていません。でも、このような例は、CSV ファイルの処理など には有効ですので、ご容赦ください。

【NOTE】CSV ファイルは Comma Separated Value ファイルの略です。 ","(カンマ)でデータを区切って記述するルールがあります。

詳しくは、http://www.rfc-editor.org/rfc/rfc4180.txt を参照してください。

代表的な例として、Excel データを CSV 形式ファイルに変換して他のアプリケーションで 利用するケースがあります。

String data = "no,name,tel,mail"; String[] tokens = data.split(",");

for (int i = 0; i < tokens.length;i++) {

System.out.println("token[" + i + "] = " + tokens[i]); } token[0] = no token[1] = name token[2] = tel token[3] = mail 実行結果例 tokens

"no" "name" "tel" "mail" tokens[0] tokens[1] tokens[2] tokens[3]

(25)

Copyrgiht(c) 2010 Kyosuke Yanai

6

テキストファイルの読み込みと編集出力

これまでの学習で、テキストファイルの読み込み、書き込み、そしてString クラスの各種メ ソッドなどについて学びました。 この章では、これまで学んだことをベースに、次のような演習をやってみましょう。 【演習課題】テキストファイルを読み、各行のデータの先頭に行番号を追加して、別のテキ ストファイルとして書き出すプログラムを作成、実行してください。 (例) 元のテキストファイル テキストファイルです。 This is the sample text file. end of the file.

出力されるテキストファイル

1: テキストファイルです。 2: This is the sample text file. 3: end of the file.

6.1 クラス構成 まず、クラス構成を考えます。読み出すテキストファイルを扱うためのクラスと、書き出す テキストファイルを扱うクラスが必要ですね。それと、行を編集するためのメソッドがどこ かに必要です。今回は、制御を担当するmain()メソッドを持つクラスに含ませましょう。 図に、この演習課題のクラス構成を示します。 図 6-1 演習課題のクラス構成(概要) 図を見て、だいたいのイメージはつかめますね。 + TextFileReader(String filePath) + readLine(): boolean + close(): void + isErrorOccurred() - String filePath TextFileReader

+ main(String[] args): void - addLineNo(String line): String

SampleFileConverter + TextFileWriter(String filePath) + write(): void + close(): void + isErrorOccurred() - String filePath TextFileWriter

(26)

(1) SampleFileConverter クラスの addLineNo()メソッド  宣言: public String addKineNo(String line)

 引数: line - 1行分の文字列を持つ String オブジェクト  機能: 指定された String オブジェクト(の文字列) の先頭に行番号を追加します。  戻り値: 先頭に行番号を追加された文字列を持つ String オブジェクト (2) TextFileReader と TextFileWriter のコンストラクタ TextFileReader と TextFileWriter のコンストラクタでは、それぞれ、指定されたファイ ルの読み出し、書き出しのための準備を行います。 この際に、IOException などの例外が発生することがあります。コンストラクタでは戻 り値を返せませんので、コール元(ここでは、SampleFileConverter)が、コンストラクタ でエラーが発生したかどうかを、(このままでは)すぐには判断できません。対策として、 次のようなことが考えられます。 案-1) 例外発生で stackTrace してプログラムを終わらせる。つまり、何らの対処もしな い方法です。 案-2) コンストラクタでエラーを再スローし、SampleFileConverter でキャッチする。 ただし、この方法についてはまだ学んでいませんね。 案-3) TextFileReader と TextFileWriter にエラーが発生したことを示す属性をもたせ、 コール元(ここでは、SampleFileConverter)から問い合わせるこどできるメソッド を用意する。 案-4) TextFileReader と TextFileWriter にエラーが発生したことを示す属性をもたせ、 readLine()、write()でエラーを返す。 ここでは、案-3) を採用しています。 その他、不都合があったらクラスのメソッドやメンバー変数を変更、追加しましょう。 6.2 ソースコード まずは、SampleFileConverter のソースコードを書いてみましょう。 リスト 6-1 SampleFileConverter.java line SampleFileConverter.java 1 2 3 4 5 6 7 package jp.lites.study.java;

public class SampleFileConverter {

static int lineNo = 0;

(27)

Copyrgiht(c) 2010 Kyosuke Yanai line SampleFileConverter.java 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 32 32 33 34 35 36 37 38 39 40 41

String inputFilePath = "d:/tmp/nosample.txt"; String outputFilePath = "d:/tmp/outsample.txt";

TextFileReader inputFile = new TextFileReader(inputFilePath); if (inputFile.isErrorOccurred()) {

System.out.println("入力ファイルにエラーがあったのでファイル変換を中止しました。"); return;

}

TextFileWriter outputFile = new TextFileWriter(outputFilePath); if (outputFile.isErrorOccurred()) {

System.out.println("出力ファイルにエラーがあったのでファイル変換を中止しました。"); return;

}

String line = null;

while ((line = inputFile.readLine()) != null) { line = addLineNo(line); outputFile.write(line); } inputFile.close(); outputFile.close(); System.out.println("ファイルを変換しました。"); }

private static String addLineNo(String str) { String no = String.format("%d: ", ++lineNo); return no.concat(str);

}

}

(28)

リスト 6-2 TextFileReader.java line TextFileReader.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 32 32 33 34 35 36 package jp.lites.study.java; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.BufferedReader; import java.io.IOException;

public class TextFileReader {

private boolean error = true; private String filePath = ""; private File file = null;

private FileReader fileReader = null; private BufferedReader bReader = null;

public TextFileReader(String filePath) { this.filePath = filePath;

file = new File(this.filePath); try {

fileReader = new FileReader(file);

bReader = new BufferedReader(fileReader); error = false;

} catch (FileNotFoundException e) {

System.out.println("指定されたファイルが見つかりません。"); }

}

public String readLine() {

String line = null;;

try {

(29)

Copyrgiht(c) 2010 Kyosuke Yanai line TextFileReader.java 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 return line; } catch (IOException e) { System.out.println("ファイル読み込みでエラーが発生しました。"); return null; } }

public void close() {

String line = null;; try { bReader.close(); } catch (IOException e) { System.out.println("ファイルクローズでエラーが発生しました。"); } }

public boolean isErrorOccurred() { return error; } } リスト 6-3 TextFileWriter.java line TextFileWriter.java 1 2 3 4 5 6 7 8 9 package jp.lites.study.java; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.PrintWriter;

(30)

line TextFileWriter.java 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 32 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46

public class TextFileWriter {

private boolean error = true; private String filePath = ""; private File file = null;

private PrintWriter pw = null;

public TextFileWriter(String filePath) { this.filePath = filePath;

file = new File(this.filePath);

try { file.createNewFile(); pw = new PrintWriter(file); error = false; } catch (FileNotFoundException e) { System.out.println("ファイル作成できませんでした。"); } catch (IOException e) { System.out.println("ファイル作成でエラーが発生しました。"); } }

public void write(String line) { pw.println(line);

}

public void close() { pw.close(); }

public boolean isErrorOccurred() { return error;

}

(31)

Copyrgiht(c) 2010 Kyosuke Yanai 6.3 eclipse でクラスを作成、実行

上記のクラスをeclipse で作成、実行してください。

実行結果の例を示します。

(32)

7

演習

7.1 CSV ファイルの読み込みと編集出力 下記のCSV ファイルを読み込んで、名前、メールアドレスを抽出して、指定の CSV 形式で ファイルに出力するプログラムを作成、実行してください。 (1) CSV ファイルの形式 メンバー番号,名前,住所,電話番号,メールアドレス,備考 (2) 出力 CSV 形式 名前,メールアドレス 7.2 2 つの CSV ファイルの読み込みと編集出力 7.1 の演習で、出力 CSV 形式を示した CSV ファイルを読んで、出力 CSV 形式を決定するよ うに変更してください。 (1) CSV ファイルの形式 メンバー番号,名前,住所,電話番号,メールアドレス,備考 (2) 出力 CSV 形式を示した CSV ファイル 名前,メールアドレス

(33)

Copyrgiht(c) 2010 Kyosuke Yanai

8

付録

(34)

9

改定履歴

(35)

Copyrgiht(c) 2010 Kyosuke Yanai

10 索引

図 2-3 (2)  新たにファイルを作成する
図 5-5 contains メソッドの記述例
図 6-2 SampleFileConverter 実行結果の例

参照

関連したドキュメント

が前スライドの (i)-(iii) を満たすとする.このとき,以下の3つの公理を 満たす整数を に対する degree ( 次数 ) といい, と書く..

ダウンロードしたファイルを 解凍して自動作成ツール (StartPro2018.exe) を起動します。.

本手順書は複数拠点をアグレッシブモードの IPsec-VPN を用いて FortiGate を VPN

ダウンロードした書類は、 「MSP ゴシック、11ポイント」で記入で きるようになっています。字数制限がある書類は枠を広げず入力してく

モノづくり,特に機械を設計して製作するためには時

証書」 ・ 「卒業(修了)証明書」に該当するものがない場合は、出身学校が作成した 12 年の

本マニュアルに記載される手順等は、無人航空機の安全な飛行を確保するために少なく

ルすると、以下のガイダンスが流れ、手順③に戻ります。 【ガイダンス】