1

私が持っているCSVファイルのいくつかのセルを少し処理する小さなアプリを書いています。オンラインで見つけたライブラリを使用して CSV ファイルを読み書きする方法を理解しましたが、問題があります。ライブラリは CSV ファイルを解析して DataTable にしますが、テーブルのセルを変更しようとすると、そうではありません。変更をテーブルに保存していません!

以下は問題のコードです。プロセスを複数の変数に分割し、いくつかの名前を変更して、この質問のデバッグを容易にしました。

コード

ループ内:

string debug1 = readIn.Rows[i].ItemArray[numColumnToCopyTo].ToString();
string debug2 = readIn.Rows[i].ItemArray[numColumnToCopyTo].ToString().Trim();
string debug3 = readIn.Rows[i].ItemArray[numColumnToCopyFrom].ToString().Trim();
string towrite = debug2 + ", " + debug3;
readIn.Rows[i].ItemArray[numColumnToCopyTo] = (object)towrite;

ループの後:

readIn.AcceptChanges();

コードをデバッグすると、行が更新されていないことを除いて、 towriteが正しく形成され、すべて問題ないことがわかります。なぜ機能しないのですか? ここで単純な間違いを犯しているように感じます。前回 DataTables を使用したとき (かなり前)、同様の問題がありました。

towriteに別のコンマを追加する理由が不思議に思われる場合は、住所フィールドと郵便番号フィールドを組み合わせているためです。これで問題が発生しないことを願っています。

小さな修正を行うために 1 つのファイルのみを編集しようとしているだけなので、私のコードはちょっと面倒です。申し訳ありません。

4

2 に答える 2

4

個々の列の値を編集する最も簡単な方法は、DataRow.Itemindexer プロパティを使用することです。

readIn.Rows[i][numColumnToCopyTo] = (object)towrite;

これは十分に文書化されていませんが、DataRow.ItemArraygetアクセサーは基になるデータのコピーを返します。Reflectorの厚意による実装は次のとおりです。

public object[] get_ItemArray() {
    int defaultRecord = this.GetDefaultRecord();
    object[] objArray = new object[this._columns.Count];
    for (int i = 0; i < objArray.Length; i++) {
        DataColumn column = this._columns[i];
        objArray[i] = column[defaultRecord];
    }
    return objArray;
}

列の値を編集するための厄介な代替方法があります。行の を取得し、ItemArrayそれらの値を変更してから、更新された配列を使用するように行を変更します。

object[] values = readIn.Rows[i].ItemArray;
values[numColumnToCopyTo] = (object)towrite;
readIn.Rows.ItemArray = values;
于 2010-03-15T16:38:00.567 に答える
0

使用SetField<>方法:

    string debug1 = readIn.Rows[i].ItemArray[numColumnToCopyTo].ToString();
    string debug2 = readIn.Rows[i].ItemArray[numColumnToCopyTo].ToString().Trim();
    string debug3 = readIn.Rows[i].ItemArray[numColumnToCopyFrom].ToString().Trim();
    string towrite = debug2 + ", " + debug3;
    readIn.Rows[i].SetField<string>(numColumnToCopyTo,towrite); 

    readIn.AcceptChanges();
于 2013-03-11T18:19:16.350 に答える