|
■No73910 (ainax さん) に返信
実際に検証してみました。
TextFieldParser は、フィールドをダブルクォート (") で囲えば、空白のフィールド ("") は
認識しますが、改行コードのみのフィールド("<CR><LF>")は空白のフィールドと同じと認識す
るという結果でした。
JET を使うと、空白のフィールド ("") と改行コードのみのフィールド("<CR><LF>")は識別
できるようです。
(1) メモ帳で以下の内容の csv ファイルを作成。
"aaaa","bbbb","cccc"
"ddd","ee
ee","ffff"
"gggg","","iiii"
"jjjj","
",""
(2) 以下のコードで cvs ファイルを読んでその中身を書き出す。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Text.RegularExpressions;
using System.Data;
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
// TextFieldParser を使う場合
using (Microsoft.VisualBasic.FileIO.TextFieldParser tfp =
new Microsoft.VisualBasic.FileIO.TextFieldParser(
"test.csv",
Encoding.GetEncoding("Shift_JIS")
)
)
{
tfp.TextFieldType =
Microsoft.VisualBasic.FileIO.FieldType.Delimited;
tfp.Delimiters = new string[] { "," };
tfp.HasFieldsEnclosedInQuotes = true;
tfp.TrimWhiteSpace = true;
while (!tfp.EndOfData)
{
string[] fields = tfp.ReadFields();
for (int i = 0; i < fields.Length; i++)
{
fields[i] = fields[i].Replace("\r", "<cr>");
fields[i] = fields[i].Replace("\n", "<lf>");
if (fields[i] == String.Empty)
{
fields[i] = "<empty>";
}
Console.Write(fields[i] + " ");
}
Console.WriteLine("");
}
}
Console.WriteLine("------------------------------------");
// Jet Provider を使う場合
string csvDir = @"C:\Users..."; // csv ファイルのあるディレクトリ
string conString =
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +
csvDir +
";Extended Properties=\"text;HDR=No;FMT=Delimited\"";
System.Data.OleDb.OleDbConnection con =
new System.Data.OleDb.OleDbConnection(conString);
string commText = "SELECT * FROM [test.csv]";
System.Data.OleDb.OleDbDataAdapter da =
new System.Data.OleDb.OleDbDataAdapter(commText, con);
DataTable dt = new DataTable();
da.Fill(dt);
foreach (DataRow row in dt.Rows)
{
foreach (DataColumn column in dt.Columns)
{
// フィールドが "" の場合 row[column] は DBNull.Value になるので注意
string field = row[column] as String;
if (field != null)
{
field = field.Replace("\r", "<cr>");
field = field.Replace("\n", "<lf>");
}
else
{
field = "<empty>";
}
Console.Write(field + " ");
}
Console.WriteLine("");
}
}
}
}
(3) 上記コードの実行結果。
aaaa bbbb cccc
ddd ee<cr><lf>ee ffff
gggg <empty> iiii
jjjj <empty> <empty>
------------------------------------
aaaa bbbb cccc
ddd ee<cr><lf>ee ffff
gggg <empty> iiii
jjjj <cr><lf> <empty>
|