- PR -

ファイル入力時の項目切出しについて

投稿者投稿内容
H2
ぬし
会議室デビュー日: 2001/09/06
投稿数: 586
お住まい・勤務地: 港
投稿日時: 2002-05-25 09:02
引用:

たいきさんの書き込み (2002-05-24 22:58) より:
ちょっと話題は違うのですが,miki さん,ご指摘の java 正規表現
パッケージは perl の正規表現の記述法みたく柔軟に記述できるものなんですか?
今回の業務開発では使わなくて済むのですが,今後勉強してみます.
みなさん,ありがとうございました.


JDK1.4からはperl似の正規表現が使えます。(APIドキュメントに詳細がかかれてます)
また、http://jakarta.apache.orgでもOROやRegexpなどPerl似の正規表現が使えるパッケージをダウンロードできます。
しょむ
ぬし
会議室デビュー日: 2001/09/06
投稿数: 430
投稿日時: 2002-05-25 15:52
う〜ん。
固定長フォーマットデータを自分自身で処理するオブジェクト…ってなんだかなぁと思ってしまいますが…。

コード:

import java.io.*;
import java.util.*;
public class LineBreaker {
StringReader sr;
public LineBreaker(String line) {
sr = new StringReader(line);
}
public String getNext(int len) throws IOException {
char[] buf = new char[len];
sr.read(buf, 0, len);
return new String(buf);
}

public static void main(String[] args) throws IOException {
LineBreaker lb = new LineBreaker(args[0]);
System.out.println(lb.getNext(3));
System.out.println(lb.getNext(5));
System.out.println(lb.getNext(2));
}
}



文字を頭からかじってくなら、こんなんつこたほうがよくないすかねぇ。
# あ、sr.read の返り値を見て UnexpectedLineLengthException とかでも
# 投げてやるべきですけどね。


[ メッセージ編集済み 編集者: しょむ 編集日時 2002-05-25 16:01 ]
たいき
会議室デビュー日: 2002/05/11
投稿数: 14
投稿日時: 2002-05-25 20:33
しょむさん、ありがとうございます。
StringReader クラスの存在を知らなかったのですが、
確かにこの対応がスマートな気がします。

ところで、
> 固定長フォーマットデータを自分自身で処理するオブジェクト…ってなんだかなぁと思ってしまいますが…。
とあるんですが、自分自身で処理しなくても他にも簡単な方法があるでしょ、
という意味でしょうか。でしたら教えてください。

例えば出力する場合でも、Cの場合は fwrite で、構造体をそのまま吐いて
固定長フォーマットになるし、読むときも fread で、構造体に入込むだけですよね。
そういう手段がやっぱり提供されてるんですか。
H2
ぬし
会議室デビュー日: 2001/09/06
投稿数: 586
お住まい・勤務地: 港
投稿日時: 2002-05-25 23:35
しょむさんへ

横から失礼します。私もちょっと質問させていただきますね。
> 固定長フォーマットデータを自分自身で処理するオブジェクト…ってなんだかなぁと思ってしまいますが…。

後学のために、「なんだかなぁ」と思う理由を教えていただけないでしょうか?
よろしくお願いします。

[ メッセージ編集済み 編集者: H2 編集日時 2002-05-25 23:37 ]
へげもん
ベテラン
会議室デビュー日: 2002/04/14
投稿数: 87
お住まい・勤務地: 埼玉県
投稿日時: 2002-05-26 01:57
 私もおそらく、しょむさんと同じ考えです。
 JavaにはそもそもSerialize機能が用意されているので、非Javaアプリケー
ションとデータをやり取りするのでなければ、各オブジェクトがファイルへの
読み書きをわざわざ自分で処理する必要はありません。
(C/C++で構造体を生で読み書きしたら、カンペキに機種依存しちゃいます)
 他のプラットフォームとのデータやり取りなら、java.io.*に習って固定長
フォーマットを読み書きするReader/Writerを作った方が汎用性がでるのは確
かです。
 あとはまあ、オブジェクト指向データベースでも使うのが一番スマートでし
ょうけど。
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2002-05-26 19:07
> 固定長フォーマットデータを自分自身で処理するオブジェクト…ってなんだかなぁと思ってしまいますが…。

それは しかたがないのでは。
文字列の内部表現が ファイルのバイト並びと違う言語なのだから。
あるいは、非オブジェクトの世界から取り込んで、オブジェクト化
する関所の処理だから、普通ぽく見えなくて当然でしょう。(汚れ役です)

冗談では、COBOL固定長処理を再現するモジュールを作り
利用する。Java で書いても 実は COBOL とか。
たいき
会議室デビュー日: 2002/05/11
投稿数: 14
投稿日時: 2002-05-26 21:27
へげもんさんへ
私また舌足らずでした.バッチの中間ファイルを目視確認したり,
sort ユーティリティを用いたりしたいので,テキストファイルを
作りたいのです.
で,C言語だったら…と私が言ってるのですが,ここで言ってる構造体の
要素は全て,char 型です.COBOLも同様で9タイプやXタイプですね.
なので,機種依存がないような構造体しか使ってないことを想定しています.
char 型だったらパディングとか機種依存じゃないですよね.これも勘違い?

java の serialize は本で読んだのですが,writeObject で吐き出すところは
確認したのですが,これだと固定長(あるいは区切り文字あり可変長)テキストファイル
って作れるのでしょうか.別に固定長テキストでなくても,java アプリ同士で
連携するには十分なんですが.
それと,
> java.io.*に習って固定長フォーマットを読み書きする
> Reader/Writerを作った方が汎用性がでる
と言われている方法とはどれのことを指しているのでしょう?
へげもんさんに以前書いていただいたソースでしょうか.
java は初学で,どうも説明が拙くなってしまい,申し訳ありません.
しょむ
ぬし
会議室デビュー日: 2001/09/06
投稿数: 430
投稿日時: 2002-05-26 22:27
「なんだかなぁ」の理由は、まぁ、へげもんさんがゆーたはるようなことですわ。他に簡単な方法があるということではなく。

Java 的には、serialize によってファイルなる実体との対応をとるべきだと思うんですが、固定長フォーマットの文字列なんてものじゃないと初期化できない Object ってどうなの?ということです。

StringBraker sb = new StringBreaker(line);
sb.setParameters(target, "3, Param1, 5, Param2, 2, Param3");

とかやると、

target.setParam1(getNext(3));
target.setParam2(getNext(5));
target.setParam3(getNext(2));

みたいにして呼び出してくれるような解析器を作るのがスジかなぁと。

それからたいきさんへ。
java の char は 2byte です。
日本語だろうがASCIIだろうが、1文字=2byte です。
ファイルがシフトJISだったりしたら文字数がくずれます。
注意してください。

byte でとるなら、FileInputStream で byte[] でとってきて、
byte[] のまま切り出し処理を行い、new String(byte[], String encoding) を使いましょう。使いましょう。

スキルアップ/キャリアアップ(JOB@IT)