質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

5252閲覧

C# TSVファイルを読み込み、バイト数で文字を編集して、出力したい。

KKcambodia

総合スコア14

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2016/05/27 13:30

COBOL出身で、C#で苦戦しています。。。

題名のとおり、タブ区切りのファイルを読み込み、
出力時に、21バイト以上の文字を削除して、出力したいのですが、
まったくわかりません。

COBOLだと、変数を固定長で定義できるので、
変数 A PIC K(20) K・・・全角文字、半角文字混在

と変数Aを定義して、代入してあげると勝手に21バイト以上の文字は削除されるのですが、
c#だとどのようにすれば、よいのでしょうか?

入力文字列(全角、半角混在)
東京都葛飾区島根1--!2

出力時
"東京都葛飾区島根1--!"

と出力したい。”2”は、20-21バイトでまたがっているので削除

最終目的はPDFでの印書までですが、文字の編集で止まってしまったので
質問致しました。

ベテランの方のご意見を頂きたく。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

SJISなら

  • 文字列をバイト配列に変換
  • 必要な分を取り出し
  • 取り出した結果の最後の1バイトが全角文字の半分だったら切り捨て

な方法が考えられます

最後の1バイトが全角文字の半分かの判定は、VB.Netだとわりとメジャーな技(vb6時代のMidBがまさしくこの動作をしていたので)なのですが、

  • 切り出したバイト配列をEncoding.GetStringでSJIS文字列にデコード

して

  • Encoding.GetByteCountでデコードしたSJIS文字列のバイト数を取る

  • 最後の1バイトが全角文字の半分

の時は

  • 元のバイト数 + 1

の値が返ってくることが利用できます
たぶんC#でも同じ動きになるはずなので、試されてはどうでしょう

投稿2016/05/27 20:25

dojikko

総合スコア3939

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KKcambodia

2016/05/29 10:18

dojikkoさま ご回答ありがとうございます。 ご指摘の意味はわかるのですが、いざ、コーディングになると。。 コーディングできないのです。。。 条件分岐で、”最後の1バイトが全角の半分”の文字など。。。 プログラマー失格ですね。。
退会済みユーザー

退会済みユーザー

2016/05/30 01:51

ま,ご自分を卑下することはないでしょ COBOL時代から考えると今の環境は相当違いますよ パンチテープセコセコやってた最後の世代の現役C#プログラマーより
KKcambodia

2016/05/30 12:52

>最後の1バイトが全角文字の半分 やはりこの部分がどうコーディングしてよいのかわかりません。。。 sjisの場合 下記のコーティングではだめなのでしょうか? using System; class Sample { static void Main() { // 01234567890123456789012345678901234567890123 string s = "The quic あ brown fox jumps over the lazy dog"; Console.WriteLine(s.Substring(0, 9)); // 0文字目から9文字分を切り出す Console.WriteLine(s.Substring(31)); // 31文字目以降を切り出す Console.ReadKey(); } }
dojikko

2016/05/31 18:44

それで目的を果たしているのなら全く問題ない訳で.. ただKKcambodiaさんがこれではダメだと思っているから質問している訳ですよね 質問では > ”2”は、20-21バイトでまたがっているので削除 と書かれていたから > 最後の1バイトが全角文字の半分かの判定 の話が出てくる訳です
KKcambodia

2016/06/01 12:57

以下のコードで実装できました。 dojikkoさん ありがとうございます。 using System; public class VBHankakuZenkaku { static void Main() { string reference = "あいうabcえ"; int ilenb = System.Text.Encoding.GetEncoding("Shift_JIS").GetByteCount(reference); int cns_93 = 6; if (ilenb > cns_93) { byte[] bytelength = System.Text.Encoding.GetEncoding("Shift_JIS").GetBytes(reference); string s = System.Text.Encoding.GetEncoding("Shift_JIS").GetString(bytelength, 0, cns_93); // 最後のreferenceが多バイトreferenceの途中で切れていないかをチェック int check = System.Text.Encoding.GetEncoding("Shift_JIS").GetString(bytelength, 0, cns_93 + 1).Length; if (s.Length == check) { reference = s.Remove(s.Length - 1); } else { reference = s; } } string スペース = "     "; string TrimString = スペース.Trim(); Console.WriteLine(TrimString.Length); //「9」が表示されます Console.WriteLine(reference); //「9」が表示されます Console.ReadKey(); } }
guest

0

c# 文字列 操作
https://www.google.co.jp/search?hl=ja&q=C%23+TSV+%E6%93%8D%E4%BD%9C&lr=lang_ja&gws_rd=ssl#lr=lang_ja&hl=ja&tbs=lr:lang_1ja&q=C%23+%E6%96%87%E5%AD%97%E5%88%97%E3%80%80%E6%93%8D%E4%BD%9C
'
COBOL なんぞでも、ランゲージリファレンスは、有ったと思いますが?
C# にも、リファレンスはあります。
c# ランゲージリファレンス
https://www.google.co.jp/search?hl=ja&q=C%23+TSV+%E6%93%8D%E4%BD%9C&lr=lang_ja&gws_rd=ssl#lr=lang_ja&hl=ja&tbs=lr:lang_1ja&q=c%23+%E3%83%A9%E3%83%B3%E3%82%B2%E3%83%BC%E3%82%B8%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9
.netframework リファレンス
https://www.google.co.jp/search?hl=ja&q=C%23+TSV+%E6%93%8D%E4%BD%9C&lr=lang_ja&gws_rd=ssl#lr=lang_ja&hl=ja&tbs=lr:lang_1ja&q=.netframework+%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9

一通り目を通した方が良いサイト
++C++; // 未確認飛行 C
https://www.google.co.jp/search?hl=ja&q=C%23+TSV+%E6%93%8D%E4%BD%9C&lr=lang_ja&gws_rd=ssl#lr=lang_ja&hl=ja&tbs=lr:lang_1ja&q=%2B%2BC%2B%2B%3B+%2F%2F+%E6%9C%AA%E7%A2%BA%E8%AA%8D%E9%A3%9B%E8%A1%8C+C

CSV / TSV が、Shift JIS / JIS / UTF-8 / 16 / 32 。。。。
エンディアン、BOM付、BOM無、
なのかのチェックが必要だったり、
カルチャの設定については、.Netframework 3.5 以降でだったり、
原則半角カナは使用しない:止むおえない場合は除く、
旧PC-9801/9821時代の、1/2角カナは、禁忌だったり、/

投稿2016/05/27 14:08

編集2016/05/27 14:14
daive

総合スコア2028

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KKcambodia

2016/05/27 14:37 編集

daive様 参考になるサイトを教えて頂きありがとうございました。 無事解決いたしました。 >CSV / TSV が、Shift JIS / JIS / UTF-8 / 16 / 32 。。。。 >エンディアン、BOM付、BOM無、 >なのかのチェックが必要だったり、 >カルチャの設定については、.Netframework 3.5 以降でだったり、 >原則半角カナは使用しない:止むおえない場合は除く、 >旧PC-9801/9821時代の、1/2角カナは、禁忌だったり、/ 文字コードは意識していなかったです。。 たぶんSjisかと。。。 ↑のエンディアン、BOM付などは、まだついていけないレベルです。。 ググって勉強してみます。 ありがとうございました。 using System; class Sample { static void Main() { // 01234567890123456789012345678901234567890123 string s = "The quic あ brown fox jumps over the lazy dog"; Console.WriteLine(s.Substring(0, 9)); // 0文字目から9文字分を切り出す Console.WriteLine(s.Substring(31)); // 31文字目以降を切り出す Console.ReadKey(); } }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問