Line.Splitの記述について

タグの編集
投稿者 SNAKE  (社会人) 投稿日時 2012/7/6 13:34:57
初級講座の第30回 ファイル処理の「4.CSVの読み込み」で
Line.Splitの区切り文字に、","を指定する場合、どのように記述すればよいでしょうか? 
以下のように記述するとエラーになってしまいます。

Line.Split("","")

よろしくお願いします。 

投稿者 魔界の仮面弁士  (社会人) 投稿日時 2012/7/6 13:50:39
> ","を指定する場合、どのように記述すればよいでしょうか? 

「,」ではなく、「","」で区切りたいという事でしょうか?
その場合は、
    Items = Line.Split("","")
ではなく、
    Items = Line.Split(""",""")
と書きます。(文字列中に「"」を含める場合は、"" と連記します)

上記のようにすると、たとえば Line が
   『"あいうえお","かきくけこ","さしすせそ"』
であった場合、「","」で区切ることで、
    Items(0) は 『"あいうえお』
    Items(1) は 『かきくけこ』
    Items(2) は 『さしすせそ"』
のように分割されます。
投稿者 SNAKE  (社会人) 投稿日時 2012/7/6 14:48:13
魔界の仮面弁士様

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

Items = Line.Split(""",""")

と書いてプログラムを動かしたところ、「,」がItemとして認識されてしまいました。

『"あいうえお","かきくけこ","さしすせそ"』
であった場合、
  Items(0) は 『 』※ブランク(それともnull?)
    Items(1) は 『あいうえお』
    Items(2) は 『,』
となり、結果的に

Items = Line.Split("""")

と書いたのと同じ結果になってしまいます。

すみませんが、何かわかりますでしょうか?

よろしくお願いします。
投稿者 (削除されました)  () 投稿日時 2012/7/6 15:21:29
(削除されました)
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2012/7/6 15:24:03
ごめんなさい! 先ほどはテストもせずに回答してしまいました。
この場合は、Split メソッドを Split 関数に置き換えて
  Items() As String = Split(Line, """,""")
としてみてください。これならば区切り文字が「","」として扱われます。


> Items = Line.Split(""",""")
上記はSplit メソッドに引数1個だけを渡す呼び出しですが、実は
Split メソッドには「String 引数を1つだけ受け取る」オーバーロードがありません。

そのため上記は
 (可能性A) Items = Line.Split(CType(""",""", Char))   'Items = Line.Split(CChar(""","""))
 (可能性B) Items = Line.Split(CType(""",""", Char())) 'Items = Line.Split(""",""".ToCharArray())
のいずれかの意味に解釈されて実行されたものと思われます。

> Items = Line.Split("""")
> と書いたのと同じ結果になってしまいます。
ということは、上記のパターンA に解釈されてしまうようですね。失礼しました。 
投稿者 shu  (社会人) 投稿日時 2012/7/6 16:11:40
区切りを「","」
としてしまうと

魔界の仮面弁士さんが示している通り
最初と最後の項目に余計な「"」が残るので

Items = Line.Split(","c).Select(Function(s) s.Trim(""""c)).ToArray()

とされた方がよいです。

(2008より前の環境でしたら、ループ文で回してTrimして下さい)
投稿者 SNAKE  (社会人) 投稿日時 2012/7/6 16:25:40
魔界の仮面弁士様

Items() As String = Split(Line, """,""")

と書いて、プログラムを動かしたところ、意図した通りに動作しました。

丁寧に教えていただき、ありがとうございました。
投稿者 SNAKE  (社会人) 投稿日時 2012/7/6 16:44:06
 shu様

Items = Line.Split(","c).Select(Function(s) s.Trim(""""c)).ToArray()

先頭項目、最終項目の「”」を取る場合は、上記の書き方で出来るのですね。
まだまだ未熟のため、初めて見る書き方ですが、解読して使わせていただきます。

アドバイス、ありがとうございました。