[C# File] ファイルの読み込みと書き込み
テキストファイルの読込
読み込んだ内容を文字列型(string)で一気に受け取る方法と
改行ごとに区切った文字列型の配列で受け取る方法があります。
すべての内容を文字列型(string)として読み込む
System.IO.FileクラスのReadAllTextメソッドを使います。
引数にファイルのパスを渡すと、テキストファイルのすべての内容がstring型で返ってきます。
読み込むテキストファイルの内容はこんな感じです。
ファイル読込
テスト
用の
ファイルです。
ではコードです。
using System;
using System.IO;
class Program
{
public static void Main()
{
var filePath = @"D:\test_utf8.txt";
var txt = File.ReadAllText(filePath);
Console.WriteLine(txt);
}
}
出力結果はこんな感じです。改行も含めすべての内容を読み込んでいます。
ファイル読込
テスト
用の
ファイルです。
すべての行を読み込んで改行ごとの文字列型配列で受け取る
System.IO.FileクラスのReadAllLinesメソッドを使うとテキストファイルの内容を行ごとに配列に入れて返してくれます。string型の配列です。
using System;
using System.IO;
class Program
{
public static void Main()
{
string filePath = @"D:\test_utf8.txt";
string[] txtArray = File.ReadAllLines(filePath);
Console.WriteLine($"配列の要素数={txtArray.Length}");
foreach (var line in txtArray) {
Console.WriteLine(line);
}
}
}
テキストファイルの書き込み(新規作成)
テキストファイルを新規作成して書き込むサンプルです。
文字列型(string)の内容を一気に書き込む方法と
文字列型の配列を指定して要素ごとに改行を入れて書き込む方法があります。
文字列型(string)の内容を一気に書き込む書き込む
System.IO.FileクラスのWriteAllTextメソッドを使うと、ファイルを新規作成してテキストを書きだします。
第1引数にファイルパス、第2引数に書き込むテキスト(string型)を指定します。
また、同じ名前のファイルがすであった場合は、内容が上書きされます。
using System;
using System.IO;
class Program
{
public static void Main()
{
var filePath = @"D:\test_utf8.txt";
var writeText = "書き込みテスト\nすでに同じ名前のファイルが\nあったら上書きされます。";
File.WriteAllText(filePath, writeText);
// 書きこんだ内容を読み込んで表示
System.Console.WriteLine(File.ReadAllText(filePath));
}
}
出力結果はこんな感じです。
書き込みテスト
すでに同じ名前のファイルが
あったら上書きされます。
書き込むテキストで改行するには \n が必要です。
文字列の配列を指定してファイルに書き込む
System.IO.FileクラスのWriteAllLinesメソッドを使うと、ファイルを新規作成して配列の内容を書きだします。配列の要素ごとに改行されます。
第1引数にファイルパス、
第2引数に書き込む文字列型の配列を指定します。
こちらも、同じ名前のファイルがすであった場合は内容が上書きされます。
using System;
using System.IO;
class Program
{
public static void Main()
{
var filePath = @"D:\test_utf8.txt";
var writeTextArray = new string[] {
"書き込みテスト",
"すでに同じ名前のファイルが",
"あったら上書きされます。",
};
File.WriteAllLines(filePath, writeTextArray);
// 書きこんだ内容を読み込んで表示
System.Console.WriteLine(File.ReadAllText(filePath));
}
}
出力結果はこんな感じです。要素ごとに改行されて出力されます。
書き込みテスト
すでに同じ名前のファイルが
あったら上書きされます。
正確には第2引数に指定できるは、IEnumerable型のデータなので、Listなどのコレクションも渡すことが出来ます。
using System;
using System.IO;
using System.Collections.Generic;
class Program
{
public static void Main()
{
var filePath = @"D:\test_utf8.txt";
var writeTextArray = new List<string> {
"書き込みテスト",
"すでに同じ名前のファイルが",
"あったら上書きされます。",
};
File.WriteAllLines(filePath, writeTextArray);
// 書きこんだ内容を読み込んで表示
System.Console.WriteLine(File.ReadAllText(filePath));
}
}
テキストファイルの書き込み(追加)
すでに存在するテキストファイルの末尾に追加する方法です。
追加でテキストを書き込む
System.IO.FileクラスのAppendAllTextメソッドを使うと、すでにあるテキストファイルの末尾にテキストを追加することができます。
引数1にファイルパス、引数2に追加で書き込むテキスト(string型)を指定します。
指定ファイパスにファイルがなかった場合は、新規作成されます。
上のサンプルコードで作成したファイルに追加してみます。
using System;
using System.IO;
class Program
{
public static void Main()
{
var filePath = @"D:\test_utf8.txt";
var writeText = "追加の書き込みテスト\n同じ名前のファイルがなかったら\n新規作成されます。";
File.AppendAllText(filePath, writeText);
// 書きこんだ内容を読み込んで表示
System.Console.WriteLine(File.ReadAllText(filePath));
}
}
出力結果はこんな感じです。
書き込みテスト
すでに同じ名前のファイルが
あったら上書きされます。
追加の書き込みテスト
同じ名前のファイルがなかったら
新規作成されます。
文字列の配列やコレクションを指定して追加する
System.IO.FileクラスのAppendAllLinesメソッドを使うと、すでにあるテキストファイルの末尾に文字列型の配列の内容を追加することができます。
第1引数にファイルパス、
第2引数に追加する文字列型の配列または文字列型のコレクションを指定します。
各要素ごとに改行されて追加されます。
こちらも、指定ファイパスにファイルがなかった場合は、新規作成されます。
using System;
using System.IO;
class Program
{
public static void Main()
{
var filePath = @"D:\test_utf8.txt";
var writeTextArray = new string[] {
"追加の書き込みテスト",
"同じ名前のファイルがなかったら",
"新規作成されます。"
};
File.AppendAllLines(filePath, writeTextArray);
// 書きこんだ内容を読み込んで表示
System.Console.WriteLine(File.ReadAllText(filePath));
}
}
CSVファイルの読み込みと書き込み
using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
class Program
{
public static void Main()
{
// csvファイルのパス
var filePath = @"D:\test.csv";
// csvに出力するデータ
var writeValues = new List<List<string>> {
new List<string>{ "Column1", "Column2", "Column3" },
new List<string>{ "value1_1", "value1_2", "value1_3" },
new List<string>{ "value2_1", "value2_2", "value2_3" },
new List<string>{ "value3_1", "value3_2", "value2_3" },
};
// csvファイルの書き込み
File.WriteAllLines(filePath, writeValues.Select(val => string.Join(",", val)));
// csvファイルの読込
var csvList = File.ReadAllLines(filePath).Where(line => !string.IsNullOrWhiteSpace(line))
.Skip(1).Select(line => line.Split(',')).ToList();
// 読み込んだcsvファイルのデータを表示する
csvList.ForEach(line => {
Console.WriteLine(string.Join(" ", line));
});
}
}
出力されるファイルはこんな感じです。
Column1,Column2,Column3
value1_1,value1_2,value1_3
value2_1,value2_2,value2_3
value3_1,value3_2,value2_3
出力結果(csvファイルを読み込んで表示)はこんな感じです。
value1_1 value1_2 value1_3
value2_1 value2_2 value2_3
value3_1 value3_2 value2_3
まず書き込みの説明です。
各列のデータList<string>のリストListに書き込むデータを設定しています(12~17行目)。外側のリストが行、内側のリストが列のデータです。
外側のリストの1要素目は列名のデータを想定しています。
File.WriteAllLinesでファイルに内容を書き込んできいます。(19行目)
メソッドにコレクションを渡す際に、LINQのSelectでデータを加工して渡しています。
Select内ではString.Joinを使って内側のリストをカンマ区切りで結合した文字列にしています。
つぎに読み込みの説明です(22~23行目)。
File.ReadAllLinesでcsvファイルの各行をstring型の配列で取得したあと、LINQでいろいろしてList<List<string>>型にしています。
WhereではString.IsNullOrWhiteSpaceを使い、空白行を除いています。
Skipでは1要素目、つまり列名の行をスキップしています。列も取り込む場合はSkip(0)
Selectではカンマ区切りにされた各行をstring.Splitでカンマで分割しています。
文字コードについて
C#でファイルを読み書きするときに使われるデフォルトの文字コードはUTF-8になっています。
シフトJISなど違う文字コードのテキストファイルを扱いたいときは、読み書き時に文字コードを指定する必要があります。
.Net Frameworkの場合
シフトJISで読み込むサンプルになります。
文字コードを指定するには名前空間System.Textが必要です。
上で紹介しているメソッドの引数の最後に、
Encoding.GetEncoding(“shift_jis”) を指定します。
using System;
using System.IO;
using System.Text;
class Program
{
public static void Main()
{
var filePath = @"D:\test_shiftjis.txt";
var writeTextArray = new string[] {
"追加の書き込みテスト",
"同じ名前のファイルがなかったら",
"新規作成されます。"
};
File.AppendAllLines(filePath, writeTextArray, Encoding.GetEncoding("shift_jis"));
// 書きこんだ内容を読み込んで表示
System.Console.WriteLine(File.ReadAllText(filePath, Encoding.GetEncoding("shift_jis")));
}
}
.Net Coreの場合
C#はUTF-8推しらしく、.net coreにはシフトJISの設定が入っていないため、設定をNuGetから取得する必要があります。
取得の手順は、
https://www.nuget.org/packages/System.Text.Encoding.CodePages/
にアクセスして、設定インストール用のコマンドを確認します。

VisualStudioのメニューから「ツール」⇒「NuGet パッケージ マネージャー」⇒「パッケージ マネージャー コンソール」を選択

コードエディターの下にコンソールが表示されます。

先ほどの設定インストール用のコマンドを貼り付けてEnterキーで実行します。

ずらずらっとインストールが実行されます。

からのサンプルコード
using System;
using System.IO;
using System.Text;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
var filePath = @"D:\test_shiftJIS.txt";
var writeTextArray = new string[] {
"追加の書き込みテスト",
"同じ名前のファイルがなかったら",
"新規作成されます。"
};
// 文字コード情報を設定
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
// 文字コードを指定して書き込み
File.AppendAllLines(filePath, writeTextArray, Encoding.GetEncoding("shift_jis"));
// 書きこんだ内容を文字コードを指定して読み込んで表示
Console.WriteLine(File.ReadAllText(filePath, Encoding.GetEncoding("shift_jis")));
}
}
}
17行目のように文字コードの設定を登録してから、各メソッドに文字コードの指定を渡します。
.NET6の場合
VisalStudio2022ではNuGetの手順はいらないみたい。