.NET TIPS

複数の行を含む文字列から1行ずつ読み出すには?

デジタルアドバンテージ
2004/12/17

 複数の行を含んだ1つの文字列から1行ずつ読み出して処理する場合、文字列中に含まれる改行コードにより文字列を分割することになる。しかし、OSによって改行コードは異なるため、その文字列がWindows以外のOSで作成されていると、改行コードの違いを意識しなくてはならない。以下の表に、各種OSで使用される改行コードについてまとめた。

OS
改行コード
文字コード
C#での表記
VB.NETでの表記
Mac OS 9まで
キャリッジ・リターン(CR)
13
\r
Cr
(またはvbCr)
Linux、Unix、
Mac OS X
ライン・フィード(LF)
10
\n
Lf
(またはvbLf)
Windows
キャリッジ・リターン(CR)
+ライン・フィード(LF)
-
\r\n
CrLfまたはNewLine
(またはvbCrLfかvbNewLine)
各種OSで使用される改行コードとC#、VB.NETでの改行コードの表記

 このような改行コードによる文字列分割を行う場合には、StringReaderクラス(System.IO名前空間)のReadLineメソッドが便利だ。このメソッドは、文字列中に含まれる改行コードが上記3種類のいずれであっても、その文字列から1行ずつ読み出すことができる。読み出した行には改行コードは含まれない。

 StringReaderクラスでは、そのコンストラクタで対象となる文字列(複数行を含む)を指定してインスタンス化する。また、ReadLineメソッドは読み出す行がなければnull(VB.NETの場合にはNothing)を返す。

 以下にStringReaderクラスを利用したサンプル・プログラムを示す。

// strreader.cs

using System;
using System.IO;

public class ReadLineFromString {
  static void Main() {
    string mac   = "改行コードは\rCRです。";
    string linux = "改行コードは\nLFです。";
    string win   = "改行コードは\r\nCR+LFです。";

    StringReader sr;
    string line;

    sr = new StringReader(mac);
    while ((line = sr.ReadLine()) != null) {
      Console.WriteLine(line);
    }
    // 出力:
    // 改行コードは
    // CRです。

    sr = new StringReader(linux);
    while ((line = sr.ReadLine()) != null) {
      Console.WriteLine(line);
    }
    // 出力:
    // 改行コードは
    // LFです。

    sr = new StringReader(win);
    while ((line = sr.ReadLine()) != null) {
      Console.WriteLine(line);
    }
    // 出力:
    // 改行コードは
    // CR+LFです。
  }
}

// コンパイル方法:csc strreader.cs
StringReaderクラスを利用したC#のサンプル・プログラム(strreader.cs)
 
' strreader.vb

Imports System
Imports System.IO
Imports Microsoft.VisualBasic.ControlChars

Public Class ReadLineFromString
  Shared Sub Main()
    Dim mac As String   = "改行コードは" + Cr + "CRです。"
    Dim linux As String = "改行コードは" + Lf + "LFです。"
    Dim win As String   = "改行コードは" + CrLf + "CR+LFです。"

    Dim sr As StringReader
    Dim line As String

    sr = new StringReader(mac)
    Do
      line = sr.ReadLine()
      If line = Nothing Then Exit Do
      Console.WriteLine(line)
    Loop
    ' 出力:
    ' 改行コードは
    ' CRです。

    sr = new StringReader(linux)
    Do
      line = sr.ReadLine()
      If line = Nothing Then Exit Do
      Console.WriteLine(line)
    Loop
    ' 出力:
    ' 改行コードは
    ' LFです。

    sr = new StringReader(win)
    Do
      line = sr.ReadLine()
      If line = Nothing Then Exit Do
      Console.WriteLine(line)
    Loop
    ' 出力:
    ' 改行コードは
    ' CR+LFです。
  End Sub
End Class

' コンパイル方法:vbc strreader.vb
StringReaderクラスを利用したVB.NETのサンプル・プログラム(strreader.vb)

 なお、VB.NETのCr、Lf、CrLf、NewLineは、Microsoft.VisualBasic名前空間のControlCharsモジュールで定義されている定数である。また、vbCr、vbLf、vbCrLf、vbNewLineは同名前空間のConstantsモジュールで定義されている定数である。End of Article

カテゴリ:クラス・ライブラリ 処理対象:文字列
使用ライブラリ:StringReaderクラス(System.IO名前空間)
使用ライブラリ:ControlCharsモジュール(Microsoft.VisualBasic名前空間)
使用ライブラリ:Constantsモジュール(Microsoft.VisualBasic名前空間)
 
この記事と関連性の高い別の.NET TIPS
文字列内の改行文字を削除するには?[C#、VB]
文字列のリソースに改行コードを埋め込むには?
Xamarin.Forms:プラットフォームに合わせた改行文字列を使うには?
OS環境ごとの改行文字列(\r\n|\n)を取得するには?
[ASP.NET]DataGridコントロールで特定の行や文字を強調するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間