none
VB2010でTSVデータをSplitしてくれない。 RRS feed

  • 質問

  • いつもお世話になります。

    VB2010で、TSVを読み込み、フィールド毎に分割したいのですが、

    以下のソースコードを実行すると、Splitしてくれません。

    どなたか、ご存知の方、お願いします。

    Public Class Form1
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
            Dim sTable As String = "ABCDEFG                  HIJKLMN"
            Dim Words As String()
            Dim delimiter As String = vbTab
    
            Words = Split(sTable, vbTab)
            'Words = Split(sTable, delimiter, -1, CompareMethod.Binary)
            MsgBox(Words(0))
    
        End Sub
    End Class

    2013年10月30日 2:58

回答

  • メニューのツール→オプションから、テキストエディタ→Basic→タブの「タブの保持」をチェックすればTABキーでタブ文字を入力できるようになるようです。インデントもタブになっちゃうようですが。

    • 回答としてマーク MitsuoTAKEI 2013年10月30日 3:57
    2013年10月30日 3:47

すべての返信

  • 本当にこのソースコードのままであるなら、ABCDEFGとHIJKLMNの間にあるのはタブ文字ではなくて空白文字なので、タブ文字では分割されなくて当然ですが。
    • 編集済み Hongliang 2013年10月30日 3:14 言い回しをちょっと変更
    2013年10月30日 3:13
  • ご返信ありがとうございます。

    空白文字に見えますが、ちゃんとTABを入力しています。

    VisualStudio上で、入力すると空白文字に変換されてしまう?

    のでしょうか?

    2013年10月30日 3:29
  • タブか空白かを見分けられるエディターでそのファイルを開いて確認してみてください。
    2013年10月30日 3:32
  • ご返信ありがとうございます。

    バイナリーエディターで見たところ、空白文字に変換されていました。

    VS上でTABを入力するには、どうすればよいのでしょうか?

    2013年10月30日 3:36
  • & で vbTab を連結するしかないようですね。
    2013年10月30日 3:43
  • メニューのツール→オプションから、テキストエディタ→Basic→タブの「タブの保持」をチェックすればTABキーでタブ文字を入力できるようになるようです。インデントもタブになっちゃうようですが。

    • 回答としてマーク MitsuoTAKEI 2013年10月30日 3:57
    2013年10月30日 3:47
  • Visual Studioであれば、メニューの[編集]-[詳細]-[スペースの表示]を行うことで、スペースとタブの違いを区別して表示してくれます。
    2013年10月30日 4:04
  • Hongliang様,galaco様

    ご回答ありがとうございました。

    確認致しました。

    確かに、インデントもTABになるようですが、当面これで運用します。

    どうもありがとうございました。

    2013年10月30日 4:11
  • 私の方で、galacoさんの回答である、

    >& で vbTab を連結するしかないようですね。

    を「回答の候補に設定」しました。
    &でvbTabを連結する方法は、Tab文字で連結する方法に比べて、この部分がTabであることが明確にわかります。ソースコードを表示する環境にも依存しません。また、Tab文字は何かの拍子に空白に変換されてしまう恐れもあります。確実なのは&でTabを連結する方法だと思います。一方で、Tab文字がたくさんあり、この部分の空白は明らかにTab文字だと判断できる場合は、Tab文字で区切ることによってソースコードがすっきりして読みやすくなり、有効だと思います。
    よって、どちらも一長一短あると思います。galacoさんの方法は今回はMitsuoTAKEIさんのニーズに合わなかったかもしれませんが、後にこのフォーラムを見た人にとって有益な情報だと思いましたので、回答の候補に設定しました。

    (参考)
    改行コードなど、定数のまとめ
    http://pckowaza.web.fc2.com/html/vbdotnet_basic_constant.html


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2013年10月30日 5:18
    モデレータ
  • trapemiya様、佐祐理様

    ご配慮、情報のご提供ありがとうございました。

    今後もよろしく、お願いいたします。

    2013年10月31日 7:32
  • MitsuoTAKEI さま よろしく。

    ちょっと気になりましたので、既に、問題解決かとは存じますが投稿します。

    Tab 文字をスペースに変換してしまうのは、エディタや環境によって様々ですね。

    将来の問題の芽を摘む意味で、
    Tab 文字 Chr(9) の有無や Split 後の分割数を把握し、
    例外処理できるようなコードにしておく事をお勧めします。

    運用を始めると何が起こるか分らないのが常ですからね。

    2013年10月31日 12:12
  • ShiroYuki_Mot様

    大変、参考になる情報をありがとうございました。

    エクセルからTSVを作成するのですが、TABの数が可変で、

    Splitの結果、とんでもないことになる問題が発生しています。

    (泥臭い後処理が必要になった)

    例外の処理を組み込むようにします。

    2013年11月1日 2:25
  • MitsuoTAKEI さま 拝見しました。

    TABの数が可変で > という事は Tab ひとつである筈の所にいくつも入るって事ですか?
    そうであれば、例外処理というよりは、Replace で逃げちゃえば如何でしょうか?
    以下の処理を再帰的に行えばどうでしょう。

     Dim testString2 As String = testString.Replace(Chr(9).ToString & Chr(9).ToString, Chr(9).ToString)

    あっ、そう、Chr(9) の数を数えて、規定を越す場合のみの処理ですね。 規定未満なら、例外処理というか、ワーニングですね。

    • 編集済み ShiroYuki_Mot 2013年11月1日 5:49 最後に1行追加
    2013年11月1日 5:43
  • TABの数が可変というのは、桁揃えのために複数個挿入されるということでしょうか?

    VBのSplit関数ではなく、StringクラスのSplitメソッドを使用するのはどうでしょうか。こちらですと、StringSplitOptions.RemoveEmptyEntriesオプションがあり連続するTABを1つのTABと見做して分割します。

    2013年11月1日 6:27
  • 佐祐理 さまのご投稿を拝見して、なる程なぁと参考投票したのですが、
    リンク先を読んでいて、変な事に気付きましたので。

    もし、TSV を生成する側が、データが無い部分で、Tab Tab で送り出していたら ... 。 怖いですね。
    Tab Nul Tab (Chr(9)Chr(0)Chr(9)) や Tab Space Tab (Chr(9)Chr(32)Chr(9)) ならいんですけどね。

    一度、確認しておく価値がありそうですね。

    2013年11月1日 7:47