C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

VB.netでのファイル処理での質問


(過去ログ 3 を表示中)

[トピック内 19 記事 (1 - 19 表示)]  << 0 >>

■2655 / inTopicNo.1)  VB.netでのファイル処理での質問
  
□投稿者/ yama 二等兵(1回)-(2006/02/27(Mon) 13:16:42)

分類:[VB.NET] 


分類:[VB.NET] 

はじめまして。
私はVB.net2003にてファイル処理モジュールを作成している者です。

VB.netで改行コードの含まれていないデータファイルを一行ずつで処理したいのですが、Input関数を使用すると、2バイト文字がランダムに混入されており行の先頭の取得に失敗しました。
どうすれば2バイト文字に左右されず、改行コードのないファイルを一行ずつ読み込むことが出来るのでしょうか。ご教示をお願い致します。

0
引用返信 編集キー/
■2656 / inTopicNo.2)  Re[1]: VB.netでのファイル処理での質問
□投稿者/ 中博俊 神(346回)-(2006/02/27(Mon) 13:25:38)
中博俊 さんの Web サイト

分類:[VB.NET] 

>VB.netで改行コードの含まれていないデータファイルを一行ずつで処理したいのですが
改行コードが入っていないのに一行ずつとはこれいかに?

もうちょっと全般的に説明と、ファイルの中身(サンプル)、読み取りロジックの最小限の部分を説明してください。

BinaryReader使って作り直しても大して大変じゃないと思うけど

0
引用返信 編集キー/
■2657 / inTopicNo.3)  Re[1]: VB.netでのファイル処理での質問
□投稿者/ まどか 曹長(82回)-(2006/02/27(Mon) 14:29:24)

分類:[VB.NET] 

> VB.netで改行コードの含まれていないデータファイルを一行ずつで処理したいのですが、

改行コードが無いのに一行を判断するには判断規則が必要です。
その規則が無いならプログラムを作りたくても作れません。

> どうすれば2バイト文字に左右されず、改行コードのないファイルを一行ずつ読み込むことが出来るのでしょうか。

上記の規則が文字コードに依存しないものにする必要があります。
というかそれを人間が作ることになるでしょうから、十分に確実性のある規則を作ればよいかと。
#"ItsCRLF"という文字があればその次が行の先頭とか。

読み方は適当なバイト数(4KBとか)で繰り返しということになるのでは。

0
引用返信 編集キー/
■2664 / inTopicNo.4)  Re[1]: VB.netでのファイル処理での質問
□投稿者/ YAS 二等兵(3回)-(2006/02/27(Mon) 18:49:46)
YAS さんの Web サイト

分類:[VB.NET] 

質問が「バイト単位でバッファに読み込むときに境界で2バイト文字が前と後ろに生き別れになってしまうのをどうしたらよいか。」という意味だとすると,バイト単位ではなく文字単位で処理をしてみたらどうでしょうか。

Dim Reader As New StreamReader("c:\test.txt", Encoding.GetEncoding("shift-jis"))
Dim buf(100) As Char
Do While Reader.Peek <> -1
Reader.ReadBlock(buf, 0, 100)
Dim str As String = buf
Debug.Print(str)
Debug.Print("")
Loop

1バイト・2バイト文字に関係なく100文字ずつ読み込みます。

(質問の意味ちがいます?)

0
引用返信 編集キー/
■2669 / inTopicNo.5)  Re[2]: VB.netでのファイル処理での質問
□投稿者/ yama 二等兵(1回)-(2006/02/28(Tue) 00:42:32)

分類:[VB.NET] 

お返事有難うございます。
2バイト文字が入ったファイルが出てくるまで、すべて半角文字だったので
Inputstring関数で読み込むことが出来たのですが、一行分が何文字なのかが不規則になったためご質問させていただいた次第です。
ソースは

FileOpen(m_sfileNo, m_sFilename, OpenMode.Input)
While Not EOF(1)
str1 = (InputString(1, 128)) ' 128文字毎で読み込み
nCnt_A += 1


End While

FileClose(1) 'ファイルを閉じる

これでいままでは使用できていましたが今回より文字数指定が出来なくなりました。バイナリでの処理とはどのようにするのでしょうか。ご教示くださると助かります。


0
引用返信 編集キー/
■2670 / inTopicNo.6)  Re[2]: VB.netでのファイル処理での質問
□投稿者/ yama 二等兵(2回)-(2006/02/28(Tue) 00:49:49)

分類:[VB.NET] 

中博俊様
まどか様
YAS様

ご回答していただき、誠に有難うございます。
一行かどうかを判断するにはまずバイト数指定でファイルを開く関数があるのかどうか、また途中の処理でMid関数で文字列検索を行うのですが、もしバイナリで開いたとき、それが出来るのかどうか、それとももっと他に良い手があるのかがわからずこちらにお伺いした次第です。
何卒宜しくお願い致します。


0
引用返信 編集キー/
■2671 / inTopicNo.7)  Re[2]: VB.netでのファイル処理での質問
□投稿者/ 中博俊 神(347回)-(2006/02/28(Tue) 00:50:50)
中博俊 さんの Web サイト

分類:[VB.NET] 

うん。だから128文字で読み取るからだめなんだよね。
128バイト読み取ってshift_jisからUnicodeに変換しないと。

暇があればサンプル作るけど。どなたかパス(^^

0
引用返信 編集キー/
■2672 / inTopicNo.8)  Re[3]: VB.netでのファイル処理での質問
□投稿者/ YAS 二等兵(5回)-(2006/02/28(Tue) 01:06:51)

分類:[VB.NET] 

128バイトで区切りたいのか,128文字で区切ってもかまわないのか,そこを確認したいです。
128文字でよいのならストリームでエンコードしながら読んだ方が楽なのではないかと思います。

>もしバイナリで開いたとき、それが出来るのかどうか

バイナリ(バイト配列)から文字列への変換はできます。
Dim Buf(128) As Byte
Dim Str As String = System.Text.Encoding.GetEncoding("shift-jis").GetString(Buf)




0
引用返信 編集キー/
■2685 / inTopicNo.9)  Re[4]: VB.netでのファイル処理での質問
□投稿者/ yama 二等兵(3回)-(2006/03/01(Wed) 19:58:14)

分類:[VB.NET] 

YAS様、中博俊様ご回答有難うございます。

>128バイトで区切りたいのか,128文字で区切ってもかまわないのか,
128バイトで区切るほうでお願いします。

0
引用返信 編集キー/
■2686 / inTopicNo.10)  Re[5]: VB.netでのファイル処理での質問
□投稿者/ daisuky 二等兵(4回)-(2006/03/02(Thu) 09:10:46)

分類:[VB.NET] 

2006/03/02(Thu) 09:25:49 編集(投稿者)
2006/03/02(Thu) 09:23:01 編集(投稿者)
2006/03/02(Thu) 09:22:29 編集(投稿者)
2006/03/02(Thu) 09:14:11 編集(投稿者)
2006/03/02(Thu) 09:12:41 編集(投稿者)
2006/03/02(Thu) 09:12:35 編集(投稿者)

yamaさん、はじめまして

128"文字"で読み取りそれからバイトに変更する方法を考えてみては。
そのためまずは、YASさんのご助言の通り、StreamReaderでやってみては。(バイトの例も示していただいていると思いますが)

コンストラクタで、エンコーディング指定
Dim SrAsciiFromFile As StreamReader = New StreamReader("C:\Temp\Test.txt", _
System.Text.Encoding.ASCII)

上記、System.Text.Encoding.ASCIIのところをYASさんのご指定の以下のもので自由にエンコード調整できます。
System.Text.Encoding.GetEncoding("shift-jis")


で、リード。
Overloads Overrides Public Function Read(Char(), Integer, Integer) As Integer

文字数指定できるようです。

上記は、StreamReaderのコンストラクタと、Read(あるいはRead系)のMSDNからの引用です。


私は、最近エンコードがばらばらなファイルをいじるときに、StreamReaderで自由に出来ているので問題ないと思います。

0
引用返信 編集キー/
■2687 / inTopicNo.11)  Re[6]: VB.netでのファイル処理での質問
□投稿者/ daisuky 二等兵(5回)-(2006/03/02(Thu) 09:16:48)

分類:[VB.NET] 

2006/03/02(Thu) 09:28:23 編集(投稿者)
2006/03/02(Thu) 09:20:26 編集(投稿者)

ごめんなさい
私が書いたものは、YASさんが既に示してくださっている情報でした。
えらそうに失礼しました。

StreamReader.Readのマニュアルには、
5文字ずつ読み込むサンプルも載ってますよ。



大量の編集失礼しました…。
(私の見当違いもひどいですね…。変な情報をご覧になった方申し訳ないです。)

0
引用返信 編集キー/
■2688 / inTopicNo.12)  Re[7]: VB.netでのファイル処理での質問
□投稿者/ yama 二等兵(2回)-(2006/03/02(Thu) 09:50:27)

分類:[VB.NET] 

daisuky様

ご回答有難うございます。
状況説明が拙くて申し訳ありません。
私なりに現状を再度整理しました。
現在、シーケンシャルファイルを読み込み、その中から必要なデータを取得する作業を行っております。
最初はすべて半角文字しか無かったので文字数指定で128文字で処理が出来ていました。しかし、2バイト文字が混入した関係から、文字数指定が出来なくなり、バイト数指定に切り替える必要が出てきたのです。
一行分ごとに改行文字が入っているなら行単位の読み込みも出来るのですが、入っていないためそれが出来ません。
1行ごとの文字数が不確定な為、バイト数指定128バイトで読み込みを行う必要があります。
バイト指定で読み込むにはどうすれば良いか教えていただけないでしょうか。

お手数をお掛けしますが何卒宜しくお願い致します。

0
引用返信 編集キー/
■2690 / inTopicNo.13)  Re[8]: VB.netでのファイル処理での質問
□投稿者/ daisuky 二等兵(6回)-(2006/03/02(Thu) 10:50:37)

分類:[VB.NET] 

シーケンシャルファイルの意味は調べてわかったのですが、実際に作ったことが無いので私では役不足であることをはじめにお伝えしておきます。

申し訳ないですが、仕様は少々矛盾しているように感じます。

2バイトが混入されたので、例えば、もともと1行あたりのバイト数が128バイトだったところに、1文字の2バイト文字が入ったところ、1行あたりはその個所だけ見ると、129バイトになってしまったのではないでしょうか。
つまり、「127バイト分の半角文字+2バイトの全角文字」という行に対して、128バイトでのアクセスをすると、2バイトの全角文字が壊れてしまうのでは?
128バイトで一行とする決め打ちは簡単ですよね。(やったことないですが)

全角(DBCS)が含まれているところは例外的に128バイトではなく扱うという意味ですよね?


それは、それとして、S-JISは一般的にこんな判定をするそうです。
バイト毎に判定しながら読み取るという世界では?>中さん、YASさん
Shift-JIS
http://e-words.jp/w/Shift20JISE382B3E383BCE38389.html

他の掲示板の引用で申し訳ないですが。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=3977&forum=7

0
引用返信 編集キー/
■2691 / inTopicNo.14)  Re[9]: VB.netでのファイル処理での質問
□投稿者/ daisuky 二等兵(7回)-(2006/03/02(Thu) 12:02:11)

分類:[VB.NET] 

そして、相変わらず見当違いが私の書き込みには見られる気がします。

こうした先頭バイト判定を手動で書かなくとも、
■2672のYASさんのコーディングで実現できる気がします。
本当にバイト単位で判定を行う場合に参照先の掲示板の判定を利用することが可能なのかと。


やっぱり書いてないのにいろいろ言ってしまったがために混乱を招いてしまってるようでしたら、申し訳ない。

0
引用返信 編集キー/
■2692 / inTopicNo.15)  Re[9]: VB.netでのファイル処理での質問
□投稿者/ 魔界の仮面弁士 軍曹(65回)-(2006/03/02(Thu) 12:33:22)

分類:[VB.NET] 

2006/03/02(Thu) 12:33:53 編集(投稿者)

> シーケンシャルファイルの意味は調べてわかったのですが、実際に作ったことが無いので私では役不足であることをはじめにお伝えしておきます。
http://www.tackns.net/word/yakubusoku.html

データの読み込みに関しては、StreamReader ではなく、
最初に中さんが■2656で書かれていた、BinaryReader を使いましょう。
その上で、■2672の YAS さんのコーディングで変換すれば OK ですよね。


> ■2672のYASさんのコーディングで実現できる気がします。
手順としてはよいですけれど、
>> Dim Buf(128) As Byte
の宣言なので、「129バイト」になってしまっていますね。

0
引用返信 編集キー/
■2694 / inTopicNo.16)  Re[10]: VB.netでのファイル処理での質問
□投稿者/ daisuky 二等兵(8回)-(2006/03/02(Thu) 13:01:35)

分類:[VB.NET] 

>魔界の仮面弁士さん
あ!そうでした!

ありがとうございます。

お恥ずかしい。


「私には経験がありませんので、お力添えできるか自信がありません」
という感じです。

0
引用返信 編集キー/
■2706 / inTopicNo.17)  Re[11]: VB.netでのファイル処理での質問
□投稿者/ YAS 二等兵(9回)-(2006/03/02(Thu) 22:54:45)
YAS さんの Web サイト

分類:[VB.NET] 

>最初はすべて半角文字しか無かったので文字数指定で128文字で処理が出来て
>いました。しかし、2バイト文字が混入した関係から、文字数指定が出来なくな
>り、バイト数指定に切り替える必要が出てきたのです。

StreamReaderを使えば文字数指定ができると思いますが,やはりバイト数指定が
いいのですか?


0
引用返信 編集キー/
■2707 / inTopicNo.18)  Re[12]: VB.netでのファイル処理での質問
□投稿者/ 中博俊 神(349回)-(2006/03/02(Thu) 23:19:32)
中博俊 さんの Web サイト

分類:[VB.NET] 

>StreamReaderを使えば文字数指定ができると思いますが,やはりバイト数指定が
いいのですか?
もじが2バイト文字かどうかじゃなくって、そのファイルが128バイトで1レコードとする仕様なわけで、それは文字数指定ではよくないわけです。
とりあえずBinaryReaderで128バイト読み取って、項目ごとにぶちきって、文字項目はShift_jisのエンコードからUnicodeに変換をしてという処理を行わなきゃいけませんね。

暇なら作るけど、ごめんちゃ(^^;;

0
引用返信 編集キー/
■2714 / inTopicNo.19)  Re[13]: VB.netでのファイル処理での質問
□投稿者/ yama 二等兵(3回)-(2006/03/03(Fri) 17:09:58)

分類:[VB.NET] 

 daisuky様
S-JISのご指摘、誠に有難うございます。単純にバイト指定するだけでは中の文字が分断して判別不能になるのですね。
 魔界の仮面弁士様
 中博俊様

>BinaryReaderで128バイト読み取って、項目ごとにぶちきって、文字項目は
>Shift_jisのエンコードからUnicodeに変換をしてという処理を行わなきゃいけま
>せんね。

了解しました。
128バイトで読むというのは、秀丸エディタで実際のデータファイルを開いたとき、128バイト指定で開くと先頭行にくるべきデータが正確に来ているのでバイト指定と判断しました。確かに皆様のご指摘どおり、奇数の1バイトのあとの2バイト文字の扱いに注意しなければならないですね。

BinaryReaderで128バイト読み取って、
Dim Buf As Byte
に格納し 
Dim Str As String = System.Text.Encoding.GetEncoding("shift-jis").GetString(Buf)
で試してみます。
皆様有難うございます。

0
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -