- - PR -
文字列をバイト単位で切り分けたい。
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-01-18 20:22
諸農です。
いえ、こちらこそ食いついた形になってしまってすみません。
う〜〜んと、CSVということは、改行付きのテキストファイルですよね。 このCSVのフィールドを切り出したい、つまり、カンマ分けされたデータ単位で 切り出したい、ということでしょうか? となれば、CSVファイルをFileStreamで開き、StreamReaderで Encodingを指定して、ReadLineしたstring変数を、単純な分け方であれば String.SplitすればOKだと思います。 ただ、カンマ付きの金額フィールドをQuoted文字などで囲んでいる場合には おかしな結果になりますね。
前述したようにカンマで区切られたフィールドの読み出しであるなら、 全角・半角を意識することなく切り出しは可能だと思います。 実際、CSVクラスを自前で作成しましたから。 切り出したフィールドの、そのフィールド内部に対するバイト指定で 切り出す、ということでしたら。。無理ですね。 ではでは(^^)/ _________________ 諸農和岳 Powered by Turbo Delphi & Microsoft Visual Studio 2005 十兵衛@わんくま同盟 http://blogs.wankuma.com/jubei/ | ||||||||||||
|
投稿日時: 2004-01-18 20:26
諸農です。
こちらで見れましたが。。ちがうのかな(^^; http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=7813&forum=3 _________________ 諸農和岳 Powered by Turbo Delphi & Microsoft Visual Studio 2005 十兵衛@わんくま同盟 http://blogs.wankuma.com/jubei/ | ||||||||||||
|
投稿日時: 2004-01-19 09:17
みなさまどうもお騒がせしました。
CSVファイルといったのは語弊がありました。 固定長のテキストファイルですね。 昔のMidB()のような関数があるはずだ!と信じていたのですけど。 これを実現するために、かなりやっかいな処理になってしまいました…。 | ||||||||||||
|
投稿日時: 2004-01-19 10:20
諸農です。
固定長のデータであれば、FileStream.Read()でバイト配列に 読み出すことが出来ますので、1行分のバイト長(+CRLF?)の Byte配列をバッファに用意して、そこに読み出したデータ配列から 指定したバイト位置、バイト長のデータを切り出してから、 Encoding.GetString()すればOKかもしれないですね。 ではでは(^^)/ _________________ 諸農和岳 Powered by Turbo Delphi & Microsoft Visual Studio 2005 十兵衛@わんくま同盟 http://blogs.wankuma.com/jubei/ | ||||||||||||
|
投稿日時: 2004-01-19 11:46
こんにちは。
こんな感じだと思うのですが...。 ただし、VB6のStrConv()とMidB()の組み合わせでの結果とは異なります。 (.NETでは、Chr$(0)を文字列に代入できない?) ご参考になれば幸いです。 | ||||||||||||
|
投稿日時: 2004-01-19 12:02
ども、ほむらです。
プログラムの話ではないので申し訳ないのですが。。。 ----- 僕個人の意見を言わせて頂くと素直にエラーではじいてしまったほうが良いように思います。 (もしくはロールバック) 半角/全角のスペースくらいはともかくとして。。。 件のファイルを読み込もうとするのは固定長ファイルのメリットをなくしています。
場所で決定しているのが固定長のメリットです。 通常足りない桁は半角スペースで埋めます。
桁ずれのエラーを出力してもいいような気がします。 DBに登録するのであれば事前のエラーチェックは厳しくして良いと思うのです。 # 皆さんの言うようにk3形式のCSVを採用したほうが良いのではないでしょうか? | ||||||||||||
|
投稿日時: 2004-01-19 13:21
例えば、別のところが作ったプログラムがそのようなものを吐き出していた場合、手直しできなかったりするんですね。 #現在あるシステムの一部リプレースなど ただし、登録されたデータを見た場合、「どこが悪くてそうなった」のかわからないため、やはり何らかのメッセージを出す方がよいとは思います。 ↑元々のデータが悪いのか、 ファイルに吐き出したPGが悪いのか、 登録したPGが悪いのか 納入後にユーザから「データがおかしい」と言われると、 一番に疑われるのは一番最後のプログラムなんですよね(-o-; | ||||||||||||
|
投稿日時: 2004-01-19 13:25
ちょっと横から失礼を。
あのう...前提となるファイルの形式を正確に説明しておいたほうが良いと思います よ。(元投稿者さん) つまり、CSVなら基本的には可変長になるわけで、項目の区切りがわからないので、セパ レータとしてカンマを使用しているファイルです。(これではないのですね?) 「固定長ファイル」というふうに書くと、行単位では固定長になっていますから、 Byte単位で定義された通りに区切ると、中に改行コードが入っていようと、半角・全角 が混在されていようと正確に読み出せるはずです。(Null文字とかは別として) ですから、固定長ならば全角の上位バイトで区切る処理等は発生するはずが無いわけです。 もし元投稿者さんが、ファイルを読み込んだ後、特定のフィールド(項目)をByte単位で 区切る必要がある場合には意識する必要があると思いますが、ファイルの読込処理のとこ ろではないはずですね。 そのあたり明確にしておいたほうが良いような... |