1

こんにちは、私はいくつかのファイルを解析して DataSet にロードする必要があり、最初の行の値が空白になることがあるという問題に遭遇しました。そのため、データを解析すると、行に値がないため、列に追加された行がオフになります[ルートコード]。

例 データ列は最初の行にあります(タブ区切り) DataRows は次の行にあります(タブ区切り)
RouteCode City EmailAddress FirstName
NULL MyCity My-Email MyFirstName

私が見ているのは、すべての列が正常に追加されていることですが、最初のタブの値が追加された各行が検出されないため、列がシフトします(意味があることを願っています)。この場合、都市データはRouteCode列にあり、最後の列はどういうわけか最初の行の値(タブ)を取得しています。

class TextToDataSet
{
    public TextToDataSet()
    { }

    /// <summary>
    /// Converts a given delimited file into a dataset. 
    /// Assumes that the first line    
    /// of the text file contains the column names.
    /// </summary>
    /// <param name="File">The name of the file to open</param>    
    /// <param name="TableName">The name of the 
    /// Table to be made within the DataSet returned</param>
    /// <param name="delimiter">The string to delimit by</param>
    /// <returns></returns>  
    public static DataSet Convert(string File,
     string TableName, string delimiter)
    {
        //The DataSet to Return
        DataSet result = new DataSet();

        //Open the file in a stream reader.
        using (StreamReader s = new StreamReader(File))
        {
            //Split the first line into the columns       
            string[] columns = s.ReadLine().Split(delimiter.ToCharArray());
            //Add the new DataTable to the RecordSet
            result.Tables.Add(TableName);
            //Cycle the colums, adding those that don't exist yet 
            //and sequencing the one that do.
            foreach (string col in columns)
            {
                bool added = false;
                string next = "";
                int i = 0;
                while (!added)
                {
                    //Build the column name and remove any unwanted characters.
                    string columnname = col + next;
                    columnname = columnname.Replace("#", "");
                    columnname = columnname.Replace("'", "");
                    columnname = columnname.Replace("&", "");
                    //See if the column already exists
                    if (!result.Tables[TableName].Columns.Contains(columnname))
                    {
                        //if it doesn't then we add it here and mark it as added
                        result.Tables[TableName].Columns.Add(columnname);
                        added = true;
                    }
                    else
                    {
                        //if it did exist then we increment the sequencer and try again.
                        i++;
                        next = "_" + i;
                    }
                }
            }
            //Read the rest of the data in the file.        
            string AllData = s.ReadToEnd();
            //Split off each row at the Carriage Return/Line Feed
            //Default line ending in most windows exports.  
            //You may have to edit this to match your particular file.
            //This will work for Excel, Access, etc. default exports.
            string[] rows = AllData.Split("\n".ToCharArray());
            //Now add each row to the DataSet        
            foreach (string r in rows)
            {

                //Split the row at the delimiter.
                string[] items = r.Split(delimiter.ToCharArray());
                //Add the item
                result.Tables[TableName].Rows.Add(items);
            }
        }

        //Return the imported data.        
        return result;
    }
}
}
4

1 に答える 1

0

ファイルのどこにも欠落しているエントリがないはずの場合 (つまり、タブの間に常に何かがあるはずです)、次を使用できます。

string[] columns = s.ReadLine().Split(delimiter.ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

columns空の配列ではないことを確認します。その場合は、次の行を読み取って処理を続行します。

while (columns.Length == 0)
{
    // Row is empty so read the next line out of the file
    columns = s.ReadLine().Split(delimiter.ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
}

これにより、データが常に塗りつぶされた行で始まることが保証されます。ただし、リストのさらに下に空のエントリがあると、機能しなくなります。

空のエントリがある可能性がある場合は、おそらくすべての列が空であることを確認する必要があります。

while (columns.All(c => string.IsNullOrEmpty(c)))
{
    // Row is empty so read the next line out of the file
    columns = s.ReadLine().Split(delimiter.ToCharArray());
}
于 2013-03-04T23:28:25.933 に答える