- PR -

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

投稿者投稿内容
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2002-05-27 12:09
固定欄の書式 I/O は無いですが、自由欄のがあります。
*Tokenizer
カンマ区切りを自分で作り 処理もできるのでは。
sacn , unpack はないですし。

お金を出せば、レガシーデータとの マッピング/バインディング
をするのは、手に入るのですが。
へげもん
ベテラン
会議室デビュー日: 2002/04/14
投稿数: 87
お住まい・勤務地: 埼玉県
投稿日時: 2002-05-27 13:10
たいきさん:
> java は初学で,どうも説明が拙くなってしまい,申し訳ありません.

 たいき晩成ってことで、がんばってください。

> 私また舌足らずでした.バッチの中間ファイルを目視確認したり,
> sort ユーティリティを用いたりしたいので,テキストファイルを
> 作りたいのです.

 非Javaアプリケーションのバッチということでよろしいでしょうか?
 すべてJavaだけのアプリケーションであれば、中間ファイルもシリアライズで行う方がJavaの利点が生かせますから。

> char 型だったらパディングとか機種依存じゃないですよね.これも勘違い?

 しょむさんが書いておられるように、Java VM上でのchar型は2バイト整数で、Windows上のC/C++とはバイトオーダーが違うため直にはやり取りできません。
 ただ、今回のように数字のみの文字列なら、UTF-8に変換されたときに1バイトとなるので問題ありませんけど。
 それから、C/C++の場合、char型のみであっても配列になると機種依存する場合がありますから、要注意です。

> java の serialize は本で読んだのですが,writeObject で吐き出すところは
> 確認したのですが,これだと固定長(あるいは区切り文字あり可変長)テキストファイル
> って作れるのでしょうか.

 私の書き込みにもあるとおり、JavaのシリアライズはあくまでもJavaアプリ同士でデータを読み書きするための仕組みと考えるべきでしょう。
 どうしても固定長フォーマットを読み書きしなければならないのなら、それ用のクラスを作るべきでしょう。

> > java.io.*に習って固定長フォーマットを読み書きする
> > Reader/Writerを作った方が汎用性がでる
> と言われている方法とはどれのことを指しているのでしょう?

 しょむさんが書かれたソースが該当します。
H2
ぬし
会議室デビュー日: 2001/09/06
投稿数: 586
お住まい・勤務地: 港
投稿日時: 2002-05-27 15:04
しょむさん、へげもんさん、MMXさん、コメントありがとうございます。

引用:

MMXさんの書き込み (2002-05-26 19:07) より:
> 固定長フォーマットデータを自分自身で処理するオブジェクト…ってなんだかなぁと思ってしまいますが…。

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


私もMMXさんと同意見です。

引用:

へげもんさんの書き込み (2002-05-27 13:10) より:
どうしても固定長フォーマットを読み書きしなければならないのなら、それ用のクラスを作るべきでしょう。


うーん。固定長フォーマットは各クラスのデータ構造によって定義されるわけですよね。その場合、固定長フォーマットの文字列→オブジェクトへの変換はその対象のクラス・コンストラクタが行うべきだと思うのですが。

つまり、しょむさんの
引用:

しょむさんの書き込み (2002-05-26 22:27) より:

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));

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


言われる解析器を作るのではなく、

コード:
public class Foo {
    public static Foo create(String s) throws FormatInvalidException {
        //StringTokenizerやsubstringを駆使して、オブジェクトの作成・初期化
        return foo;
    }
}


こんな感じに各クラスごとに文字列からインスタンスを返すstaticメソッドもしくは、シンプルにコンストラクタで、
コード:
public class Foo {
    public Foo(String s) {
        //StringTokenizerやsubstringを駆使して、オブジェクトの初期化
    }
}


オブジェクトを文字列から作成・初期化して、書き出しの場合はtoString()をオーバーライトしてtoString()から返される文字列をファイルに書き込むようにするのはどうなんでしょうか?

この方がわざわざ他にクラスを作る必要がないのでシンプルで簡単かなと思います。また、文字列フォーマットもクラスで管理できますよね。

どうでしょうか?

#う〜、なんか怒られそう・・・。
しょむ
ぬし
会議室デビュー日: 2001/09/06
投稿数: 430
投稿日時: 2002-05-27 18:51
クラスなりオブジェクトなりというのは、初期化がメインではなくて、
それの提供する抽象的な機能が重要なのですから、
「固定文字列フォーマット」という初期化用データ構造にべたべたのクラスって
どうなのかなぁという気分です。

もちろん、そのオブジェクトが「固定文字列フォーマット」に密接に関係している
(たとえば、ホスト電文をそのままBeanやHashtableに相互変換するようなもの)
であれば、「固定文字列フォーマット」と「その定義/マッピング」を与えて初期化する、
というのは納得いくんです。

クラスが少ない方がシンプルというのはナニでしょう。
共通化できる機能は別に切り出すというのがOOの基本では。
H2
ぬし
会議室デビュー日: 2001/09/06
投稿数: 586
お住まい・勤務地: 港
投稿日時: 2002-05-27 19:10
引用:

クラスなりオブジェクトなりというのは、初期化がメインではなくて、
それの提供する抽象的な機能が重要なのですから、
「固定文字列フォーマット」という初期化用データ構造にべたべたのクラスって
どうなのかなぁという気分です。

もちろん、そのオブジェクトが「固定文字列フォーマット」に密接に関係している
(たとえば、ホスト電文をそのままBeanやHashtableに相互変換するようなもの)
であれば、「固定文字列フォーマット」と「その定義/マッピング」を与えて初期化する、
というのは納得いくんです。


なるほど。納得です。

引用:

クラスが少ない方がシンプルというのはナニでしょう。
共通化できる機能は別に切り出すというのがOOの基本では。


確かに。まぁ、でも私の経験(といってもしょぼいですけど)で言えば共通化できる機能を最初からたくさん割り出しても使わない事が多いような・・・。それにリファクタリングもあることですし、共通機能の切り出しは後からでもできますよね。(「できる」と「する」は別ですけどね。)

勉強になりました。m(_ _)m

[ メッセージ編集済み 編集者: H2 編集日時 2002-05-27 19:12 ]

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