C# TSVファイルを読み込み、バイト数で文字を編集して、出力したい。
解決済
回答 2
投稿
- 評価
- クリップ 0
- VIEW 3,627
COBOL出身で、C#で苦戦しています。。。
題名のとおり、タブ区切りのファイルを読み込み、
出力時に、21バイト以上の文字を削除して、出力したいのですが、
まったくわかりません。
COBOLだと、変数を固定長で定義できるので、
変数 A PIC K(20) K・・・全角文字、半角文字混在
と変数Aを定義して、代入してあげると勝手に21バイト以上の文字は削除されるのですが、
c#だとどのようにすれば、よいのでしょうか?
入力文字列(全角、半角混在)
東京都葛飾区島根1--!2
出力時
"東京都葛飾区島根1--!"
と出力したい。”2”は、20-21バイトでまたがっているので削除
最終目的はPDFでの印書までですが、文字の編集で止まってしまったので
質問致しました。
ベテランの方のご意見を頂きたく。
よろしくお願いいたします。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
SJISなら
- 文字列をバイト配列に変換
- 必要な分を取り出し
- 取り出した結果の最後の1バイトが全角文字の半分だったら切り捨て
な方法が考えられます
最後の1バイトが全角文字の半分かの判定は、VB.Netだとわりとメジャーな技(vb6時代のMidBがまさしくこの動作をしていたので)なのですが、
- 切り出したバイト配列をEncoding.GetStringでSJIS文字列にデコード
して
- Encoding.GetByteCountでデコードしたSJIS文字列のバイト数を取る
と
- 最後の1バイトが全角文字の半分
の時は
- 元のバイト数 + 1
の値が返ってくることが利用できます
たぶんC#でも同じ動きになるはずなので、試されてはどうでしょう
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
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角カナは、禁忌だったり、/
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.32%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2016/05/29 19:18
ご回答ありがとうございます。
ご指摘の意味はわかるのですが、いざ、コーディングになると。。
コーディングできないのです。。。
条件分岐で、”最後の1バイトが全角の半分”の文字など。。。
プログラマー失格ですね。。
2016/05/30 10:51
COBOL時代から考えると今の環境は相当違いますよ
パンチテープセコセコやってた最後の世代の現役C#プログラマーより
2016/05/30 21:52
やはりこの部分がどうコーディングしてよいのかわかりません。。。
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();
}
}
2016/06/01 03:44
ただKKcambodiaさんがこれではダメだと思っているから質問している訳ですよね
質問では
> ”2”は、20-21バイトでまたがっているので削除
と書かれていたから
> 最後の1バイトが全角文字の半分かの判定
の話が出てくる訳です
2016/06/01 21: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();
}
}