0

私の要件は、テキストファイルを分割してデータテーブルに保存する必要があることです。次のコードと列区切り文字 "|" を参照してください。および行セパレーター「^」:

var text = streamReader.ReadToEnd();
var lines = text.Split('^');
var rows = lines.Select(l => new {Line = l, Fields = l.Split('|')});
var colCount = rows.Max(r => r.Fields.Length);

var tblRegistration = new DataTable();
for (int i = 1; i <= colCount; i++)
{
    tblRegistration.Columns.Add("Column" + i, typeof (string));
}

正しいフォーマットであれば問題なく動作します。

ただし、エンドユーザーは次のようなテキストファイルをアップロードできます

adfafdsafsdfsdfs^fsdf|sfsdf|sdfsfd|dfs...

最初の行には 1 つの列しかありませんが、4 つある必要があります。この場合、それを検証する方法は?

4

2 に答える 2

3

おそらく次のようなものが必要なようです。

// Call ToList to avoid splitting every time you access
var rows = lines.Select(l => new {Line = l, Fields = l.Split('|')}).ToList();

var expectedColumns = rows[0].Fields.Length;
if (rows.Any(row => row.Fields.Length != expectedColumns))
{
    // There's a broken row. Throw an exception or whatever...
}

もちろん、すべての行に同じ数のフィールドが必要であると仮定しています。

壊れた行を表示したい場合は、次のように変更できます。

var firstBadRow = rows.FirstOrDefault(row => row.Fields.Length != expectedColumns));
if (firstBadRow != null)
{
    // Handle it however you want...
}
于 2012-07-17T12:55:19.437 に答える
0

左から右にすべての列を埋めることが目的の結果である場合は、簡単です。

foreach (var row in rows)
{
    var newRow = tblRegistration.Rows.Add();
    newRow.ItemArray = row.Fields;
}

したがって、サンプルファイルはこれを生成しますDataTable

Column1            Column2   Column3    Column4
adfafdsafsdfsdfs            
fsdf               sfsdf     sdfsfd     dfs

例外をスローする場合:

foreach (var row in rows)
{
    if(row.Fields.Length != tblRegistration.Columns.Count)
        throw new Exception("Please upload the correct format");

    var newRow = tblRegistration.Rows.Add();
    newRow.ItemArray = row.Fields;
}
于 2012-07-17T13:05:41.330 に答える