特にExcelで作成したCSVファイルを読み込む場合、フィールド自体にコンマや改行が含まれていたり、フィールドがダブルクオーテーションで囲まれていたり、いなかったりなど、結構面倒な処理が必要であった。
C++6.0 と違い .NET(2.0以上)は簡単にCSV形式を扱うことが可能となっている。
実際にはTextFieldParserクラスを使用して読み込みを行えば良い。
まずは、参照に、Microsoft.VisualBasic.dll を追加する。
その後に.csファイルに下記を記載すればOK。ホント簡単である。
■インポート
using Microsoft.VisualBasic.FileIO;
■実装
TextFieldParser parser = new TextFieldParser("filename.csv",
System.Text.Encoding.GetEncoding("Shift_JIS"));
using (parser) {
parser.TextFieldType = FieldType.Delimited;
parser.SetDelimiters(","); // デリミタ指定
// parser.HasFieldsEnclosedInQuotes = false;
// parser.TrimWhiteSpace = false;
while (!parser.EndOfData) {
string[] row = parser.ReadFields();
foreach (string field in row) {
// 各処理
}
}
}
なお、下記はお好みに応じて指定。
「"」処理をしない場合はfalseを(デフォルトtrue)。
単純にデリミタ区切りでそのまま出力されるため、""内の','もデリミタと判定される。
parser.HasFieldsEnclosedInQuotes = false;
フィールド前後の空白文字を削除しない場合はfalseを(デフォルトtrue)。
parser.TrimWhiteSpace = false;
※なお、フィールド内の改行は0x0Aなので、SQLServer等、DB登録する際には注意(0x0D0Aに変換する必要有り)。
■Excel CSV 書き出し
また、逆に書き出す時はどうするか...
自分はこんな関数を作って1行文字列を生成してWriteLine()で書き出している。
string getWriteLine(string[] fields) {
string s = string.Empty;
for (int i = 0; i < fields.Length; i++) {
string field = fields[i];
//"で囲む必要があるか?
if (field.IndexOf('"') > -1 ||
field.IndexOf(',') > -1 ||
field.IndexOf('\r') > -1 ||
field.IndexOf('\n') > -1 ||
field.StartsWith(" ") || field.StartsWith("\t") ||
field.EndsWith(" ") || field.EndsWith("\t")) {
if (field.IndexOf('"') > -1) {
//"を""とする
field = field.Replace("\"", "\"\"");
}
field = "\"" + field + "\"";
}
s += field;
if (fields.Length -1 > i) {
s += ',';
}
}
return s;
}