- PR -

文字列をバイト単位で切り分けたい。

投稿者投稿内容
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-01-18 20:22
諸農です。

引用:

にのっちさんの書き込み (2004-01-18 18:28) より:
何度も教えていただきありがとうございます。


いえ、こちらこそ食いついた形になってしまってすみません。

引用:

やりたいことを具体的にいうと、
固定長のCSVファイルからDBにレコードを取り込むために、


う〜〜んと、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/
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 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/18
投稿数: 8
投稿日時: 2004-01-19 09:17
みなさまどうもお騒がせしました。

CSVファイルといったのは語弊がありました。
固定長のテキストファイルですね。

昔のMidB()のような関数があるはずだ!と信じていたのですけど。
これを実現するために、かなりやっかいな処理になってしまいました…。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-01-19 10:20
諸農です。

引用:

にのっちさんの書き込み (2004-01-19 09:17) より:

CSVファイルといったのは語弊がありました。
固定長のテキストファイルですね。



固定長のデータであれば、FileStream.Read()でバイト配列に
読み出すことが出来ますので、1行分のバイト長(+CRLF?)の
Byte配列をバッファに用意して、そこに読み出したデータ配列から
指定したバイト位置、バイト長のデータを切り出してから、
Encoding.GetString()すればOKかもしれないですね。

ではでは(^^)/
_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
デフロボ
会議室デビュー日: 2003/07/31
投稿数: 8
投稿日時: 2004-01-19 11:46
こんにちは。

コード:
    Private Function MidB16(ByVal Src As String, ByVal n As Integer, ByVal c As Integer)

        Dim sjis As System.Text.Encoding = System.Text.Encoding.GetEncoding("Shift_JIS")
        Dim s() As Byte = sjis.GetBytes(Src)
        Dim t() As Byte

        ReDim t(c - 1)
        System.Array.Copy(s, 1, t, 0, c)
        Select Case t(c - 1)
            Case &H81 To &H9F, &HE0 To &HFC
                t(c - 1) = &H20
        End Select
        Return sjis.GetString(t)

    End Function



こんな感じだと思うのですが...。
ただし、VB6のStrConv()とMidB()の組み合わせでの結果とは異なります。
(.NETでは、Chr$(0)を文字列に代入できない?)

ご参考になれば幸いです。
ほむら
ぬし
会議室デビュー日: 2003/02/28
投稿数: 583
お住まい・勤務地: 東京都
投稿日時: 2004-01-19 12:02
ども、ほむらです。
プログラムの話ではないので申し訳ないのですが。。。
-----
僕個人の意見を言わせて頂くと素直にエラーではじいてしまったほうが良いように思います。
(もしくはロールバック)
半角/全角のスペースくらいはともかくとして。。。
件のファイルを読み込もうとするのは固定長ファイルのメリットをなくしています。

引用:

固定長のCSVファイルからDBにレコードを取り込むために、
何バイト目から何バイトの文字列という形で区切りたいのです。
その文字列には半角文字・全角文字が混在するので、
何文字分という切り出し方ではいけないのです。 ←こことか


場所で決定しているのが固定長のメリットです。
通常足りない桁は半角スペースで埋めます。

引用:

やりたいこととしては、
"1234512345アイウエオあいうえお"という文字列があったとして、
8バイト目から5バイトの文字列⇒"23"(4は捨てる) ←※特にこの辺
20バイト目から5バイトの文字列⇒"オあい"
というふうに取りたいのです。


桁ずれのエラーを出力してもいいような気がします。
DBに登録するのであれば事前のエラーチェックは厳しくして良いと思うのです。

# 皆さんの言うようにk3形式のCSVを採用したほうが良いのではないでしょうか?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-01-19 13:21
引用:

ほむらさんの書き込み (2004-01-19 12:02) より:

僕個人の意見を言わせて頂くと素直にエラーではじいてしまったほうが良いように思います。
(以下略)


 例えば、別のところが作ったプログラムがそのようなものを吐き出していた場合、手直しできなかったりするんですね。
#現在あるシステムの一部リプレースなど


 ただし、登録されたデータを見た場合、「どこが悪くてそうなった」のかわからないため、やはり何らかのメッセージを出す方がよいとは思います。
↑元々のデータが悪いのか、
 ファイルに吐き出したPGが悪いのか、
 登録したPGが悪いのか
 納入後にユーザから「データがおかしい」と言われると、
 一番に疑われるのは一番最後のプログラムなんですよね(-o-;
Beatle
ぬし
会議室デビュー日: 2003/06/09
投稿数: 394
投稿日時: 2004-01-19 13:25
ちょっと横から失礼を。

あのう...前提となるファイルの形式を正確に説明しておいたほうが良いと思います
よ。(元投稿者さん)

つまり、CSVなら基本的には可変長になるわけで、項目の区切りがわからないので、セパ
レータとしてカンマを使用しているファイルです。(これではないのですね?)
「固定長ファイル」というふうに書くと、行単位では固定長になっていますから、
Byte単位で定義された通りに区切ると、中に改行コードが入っていようと、半角・全角
が混在されていようと正確に読み出せるはずです。(Null文字とかは別として)
ですから、固定長ならば全角の上位バイトで区切る処理等は発生するはずが無いわけです。

もし元投稿者さんが、ファイルを読み込んだ後、特定のフィールド(項目)をByte単位で
区切る必要がある場合には意識する必要があると思いますが、ファイルの読込処理のとこ
ろではないはずですね。

そのあたり明確にしておいたほうが良いような...

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