• 締切済み

半角全角混在文字列の空白埋めについて

現在SQLServer2000のデータを固定長で出力したいと考えています。 項目ごとに固定長にして、カンマ区切りにします。 既定の長さに達しない場合は、それぞれ半角空白で埋めます。 しかしいくつかの項目では、半角と全角が混在しており、うまく想定した形になりません。 項目はnvarchar型です。 SELECT文だけで行う方法を教えて下さい。 よろしくお願いいたします。 例 A(2桁)  B(20桁)    C(20桁) 01    H25/4 入金  確認済み 02    電話済み   〒123-4567

みんなの回答

  • innoya
  • ベストアンサー率71% (10/14)
回答No.3

こんにちは。 イノ(inno)です。 20文字に達してなかった場合、半角空白で埋めるなら、 データ型をnvarcharにする必要はありますでしょうか? データ型をncharに変更すれば簡単に解決できる問題ですので ご検討ください。 下記のテスト用のSQLを参考してください。 「ColB」カラムのみnchar(20)に変更してみました。 nchar(20)にすると20文字に達してなかった場合、半角空白を自動で埋めます。 --#### テスト用のSQL #### START ################# USE tempdb GO --#### 一時テーブル作成 CREATE TABLE dbo.TempTable ( ColA nvarchar(2) ,ColB nvarchar(20) ,ColC nvarchar(20) ) --#### テストデータ登録 INSERT INTO dbo.TempTable(ColA, ColB, ColC) SELECT '01', 'H25/4 入金', '確認済み' UNION ALL SELECT '02', '電話済み', '〒123-4567' --#### データ確認 SELECT TOP 20 * FROM dbo.TempTable --#### データ型変更 ALTER TABLE dbo.TempTable ALTER COLUMN ColB nchar(20) --#### データ確認 SELECT TOP 20 * FROM dbo.TempTable --#### テスト用のSQL #### END ################# 「ColB」カラムのデータを確認してください。 後ろに空白が入っていることが確認できると思います。 データ型を変更するだけで既存のデータにも自動的に反映されますので、 もしデータが多い場合は反映まで時間がかかるかも知れません。

nrblue
質問者

お礼

数年前に入れたシステムで既にnvarcharで設定されており、 遠方のために変更もできません。 そのため現地の方に簡単にデータを作成してもらう手段を考えていました。 最終的にはSQLオンリーは断念し、VB.netで変換プログラムを作成しました。 ありがとうございました。

  • sora1515
  • ベストアンサー率58% (54/92)
回答No.2

以下でバイト数が出るらしいので DATALENGTH(CONVERT(VARCHAR(50), str)) 20-(上記) で必要分スペース詰めてはどうですかね。 LEFT(B + '____________________', 20 - DATALENGTH(CONVERT(VARCHAR(50), B)))

nrblue
質問者

お礼

既にこの方法はやってみましたが、NGでした。 ありがとうございました。

  • chie65535
  • ベストアンサー率43% (8520/19368)
回答No.1

SELECT A,LEFT(B + "____________________",20),LEFT(C + "____________________",20) FROM TABLE これでダメなら、フィールドの最大文字数を、2、20、20桁にした作業用テーブルを用意し INSERT INTO TABLE2(A,B,C) SELECT A,B + "____________________",C + "____________________" FROM TABLE で、後ろに半角スペースを20文字足した値をINSERT INTOで作業テーブルに書き込んでから、作業テーブルをエクスポートするか、作業テーブルに対して全件抽出。 注:連続した半角スペースを書いてもスペース1文字にされちゃうので、上記例は「半角スペース」を「_」に書き換えてあります。

nrblue
質問者

お礼

nvarcharではどちらの方法も正確な答えが出ませんでした。 ありがとうございました。

関連するQ&A

  • 全角半角考慮した文字列分割

    A列           B列         C列 あいうえおかきくけこ  あいうえ      おかきくけこ アイウエオカキクケコ   アイウエオカキクケ  コ あいうえオかきくけこ   あいうえオ    かきくけこ A列に全角半角混在のテキスト項目があります。 B列、C列に以下のルールで分割したいのですが、Excel関数で 実現可能でしょうか?可能な場合は式をご教授して 頂けますでしょうか。宜しくお願い致します。 ※全角をバイト数指定で分割して文字化けしないように 全角半角を考慮して分割したいと考えております。 B列  A列9桁目が半角の場合は半角9文字 A列9桁目全角の場合は半角8文字(全角4文字)をB列へ C列  A列10桁目が半角の場合は、左端10桁目~半角9文字 A列10桁目が全角の場合は、左端9桁目~半角9文字

  • 全角半角を意識した文字分割

    A列           B列   C列  D列  E列     あいうえおかきくけこ  あ   いう  えお  か アイウエオカキクケコ    アイウ   エオ  カキ ク あイウえオかきくけこ    あ   イウえ  オか き 先ほど同じような質問を一度しているのですが、 A列に全角半角混在のテキスト項目があります。 B列、C列、D列、E列に以下のルールで分割したいのですが、 Excel関数で 実現可能でしょうか? 可能な場合は式をご教授して頂けますでしょうか。宜しくお願い致します。 ※全角をバイト数指定で分割して文字化けしないように全角半角を考慮して分割した いと考えております。 B列(半角3文字)  A列3桁目が半角の場合は半角3文字 A列3桁目全角の場合は半角2文字(全角1文字) C列 (半角4文字) A列4桁目が半角の場合は、左端4桁目~半4文字分 A列4桁目が全角の場合は、左端3桁目~半角4文字 D列(半角4文字) A列7桁目が半角の場合は、左端7桁目~半4文字分 A列7桁目が全角の場合は、左端6桁目~半角4文字 E列(半角2文字) A列11桁目が半角の場合は、左端11桁目~半2文字分 A列11桁目が全角の場合は、左端10桁目~半角2文字

  • カウントイフ関数についてですが、半角や全角空白にお

    カウントイフ関数についてですが、半角や全角空白においても、区別してくれる関数なのでしょうか。それともしないものなのでしょうか。 とある2列を比較するため、イフ関数・カウントイフ関数➕トリム関数を使用したのですが、トリム関数には、真ん中の空白が残っています。それゆえ、その真ん中の箇所に半角全角が混在しており、カウントイフ関数では、それを別物と考えるとしたら、ジス関数などで加工する必要があると考えたので、この質問をさせていただきました。 どなたか ご存知の方がいたら、ご教示いただけないでしょうか。

  • 全角空白のTRIMができない・・・

    文字列の前後の全角空白を除去するのに trimが使えると思っていたのですが、できませんでした。 (半角なら取れるのですが・・・) select trim(' あいうえお ') from dual; 何とか前後の全角空白を除去したいのですが、 何か方法はないでしょうか。

  • 半角/全角文字混在データの分割方法

    VB6.0にて、あるデータ項目の内容を、画面上の2つの表示領域に分割して セットする方法を教えて下さい。 あるファイルの項目として、「住所」という項目があるとします。 このデータを取得し、画面に表示する際に、「住所1」「住所2」とに分割して、 セットします。 この場合、ファイル上の「住所」は、キャラクタタイプで40バイトと定義されており、 ”半角/全角文字混在”でデータが格納されています。 画面上の、「住所1」「住所2」はそれぞれ、20バイトとします。 この様な条件で、単純に取得したデータを2分割すると、 取得したデータが、全て半角か全角なら問題はないのですが、 例えば、1文字目が半角で、以降が全て全角文字だった場合に、 最後の全角文字がぴったり収まらなくなり、うまく表示できないように思います。 また、文字を取得する際に、使用している、Mid(MidB)関数やLen(LenB)関数も、 うまく利用できていないようです。(コード体系の違いでしょうか?) どなたかご教授下さい。 よろしくお願いします。

  • splitを使ってスペース位置で文字列を区切りたい

    splitを使ってスペース位置で文字列を区切りたいのですが、 String[] word = str.split(" ",0);  //半角空白 のように書くと、全角スペースは区切りとしてみなされず、 String[] word = str.split(" ",0);  //全角空白 のように書くと、半角スペースは区切りとしてみなしてくれません。 全角スペースでも半角スペースでも、スペース位置で文字列を区切りたいのですが、どのように書けばよいのでしょうか?

    • ベストアンサー
    • Java
  • 空白文字を含む文字列データの検索

    検索したいデータに空白がある時空白のない検索文字列でlike検索して データがヒットするようにしたいです col1 NTTデ ー タ NTTデ - タ シ ス テ ム ズ NTTデ ー タ ク オ リ テ ィ 日立製作所 IBM このようなカラムのデータが入っているとします ※空白を含むデータや空白を含まないデータがあるとします これを select * from table1 where col1 like '%NTTデータシス%' とするとNTTデ ー タ シ ス テ ム ズが検索されるようにしたいと思っています。 replace関数を使って実現しようと思ったのですが SELECT REPLACE(col1,' ','') as col1 From table1 where col1 like '%システムズ%' これだとデータがヒットせず単純に表示するときに空白が削除されるだけです どうすれば空白を含むデータを検索することができるでしょうか できれば全角・半角両方を含む文字のデータでも検索できるようにしたいです SQLServer 2005を利用しています。

  • テキストの貼り付け(全角と半角の混在)。

    お世話になります。 テキストデータをエクセル(2007)にセル別に貼り付けようと思います。 単純にコピーしてエクセルに貼り付け、貼り付け後セル別にMID関数で読み取って使用したら名前(全角)の中に空白があり、後の半角数字データが上手く読み取れません(ずれてしまうのでそのつど空白部分を半角分削除)。 区切りウィザードの利用も考えたのですが、読み取り、貼り付け回数が多いのでいちいち設定してられません。以下のような場合どのようにしたら良いでしょうか(最後の数字(記号)を同じ列のセルに入れたい)。 例 福田康夫 OKを =MID(A1,1,4) だと 福田康夫 吉田  茂 OKを =MID(A2,1,4) だと 吉田   吉田と茂の間は2文字になるので最後のOKがずれてしまう。という感じです。 実際には名前とOKの間には半角の数字が多く並んでいるので、吉田と茂の間にカーソルを持って行き半角分(一文字分)DELすると指定したセルにはまるのですが、、。 何か良い方法があったらご教授ください。

  • エクセルで選択範囲内の半角空白を取り除きたい。

    エクセルで選択範囲内の半角空白を取り除きたい。 エクセルの各セルに歌のタイトルが入っています。 ところがところどころに半角スペースが入ってしまっているためこれを取り除きたいのですが すべてを取り除くのであれば選択範囲内であっても「検索置換」を使えばできますが 条件として日本語に混在するスペースのみをとり除き、 英文の単語間にあるものはそのままにしたいのです。 基本的に、全角にはさまれた半角空白のみを対象として、 半角にはさまれた空白はいじらないことになります。 (いじらない場合として半角数字も該当してしまいますが、ほとんど該当がないものと考えています) 関数、マクロ等でなにかいい知恵がありましたら教えてください。

  • VB2005 DataGridViewの全角・半角混在のカラムの並び替え

    VB2005で開発、データベースはオラクル10gです。 全角・半角文字混在の項目を昇順で読み込み、DataGridViewの表に取り込みます。その後、ヘッダーカラムの並び替えを行うと順番が変わっていまいます。 具体的には 1.読み込み時は、空白は最尾、並び替え後は先頭にくる。 2.読み込み時、括弧(「[」)の半角と全角は別々に並んでいますが、並び替え後は半角と全角との区別はなく、並び替えられます。 カラムを別に設けて、コード体系を変換して、そのカラムを並び替えすればいいのでしょうか? コード体系の知識は弱いので、お教えください。 PRIVATE SUB BUTTON_CLICK(省略) DIM I AS INTEGER DIM S AS STRING FOR I = 0 TO DataGridView1.Rows.Count - 1 S = DataGridView1(1,I).VALUE '-----ここで変換?    DataGridView1(2,I).VALUE = S NEXT DataGridView1.Sort(DataGridView1.Column(2), _ System.ComponentModel.ListSortDirection.Ascending) END SUB よろしくお願いします。