0

ファイル インポート クラスを実装する良い方法を考えるのに苦労しています。

任意のファイルを読み取れるようにしてから、行の内容の区切り記号に基づいて、ファイルの構造 (タイプ構造ではなく) を決定できるようにしたいと思います。

たとえば、A.txt というファイルがあるとします。

このファイルには、区切り文字、区切り記号、

「,」で分割した場合、結果は文字列の配列になりますが、区切り文字を動的に決定し、出力を列名として設定するにはどうすればよいですか?

a.txt の最初の行が「1,2,3,4,5」だったとします。

出力は

delimter : ","
column[0] = "1"
column[1] = "2"
column[2] = "3"
column[4] = "4"
column[5] = "5"

誰か良いアイデアはありますか?よくわかりませんが、文字列の値に応じてデータ型が何であるかを魔法のように判断することは可能でしょうか。

ありがとう

4

4 に答える 4

1

区切り記号の可能性がある記号の配列と、区切り記号ではない記号の 2 番目の配列がある場合、すべてが簡単です。delimetersArray から最初のシンボルを見つけて、それを使用して分割します。

デリメータ間の部分の長さが同じであれば、それも簡単です。

パーツや区切りがいくつあっても区別がつきません。

于 2012-10-19T13:52:48.533 に答える
1

データ型を知っていて、区切り文字を決定するための区切り文字が単一の文字である場合は、次のことができます (疑似コード)。

char FindDelimiter(string firstLine)
{
    for (int i = 1; i < firstLine.Length; i++)
    {
        if(!CanBeParsedAsKnownDataType(firstLine.SubString(0,i))
        {
            // this one cannot be parsed as a known datatype anymore
            // so it must be the delimiter 
            return firstLine[i];
        }
    }

    // if we reach this, nothing was found
    return '';
}   

これは、実際の値の部分文字列をデータ型として解析できる数値などのデータ型に対してのみ機能することに注意してください。

于 2012-10-19T13:54:51.437 に答える
1

利用できる魔法はありません。できることは、最初の行を反復して、どの文字が最も頻繁に出現するかを見つけることだけです。次に、このリストを可能な区切り記号候補のリストと比較し、最初に出現するものを見つけます。

以下は、文字列を分析して文字列を返すコード例です。多分これはあなたの「魔法のコード」の出発点です:

var line = "1,2,3,4,5,6";
var analysis = line.GroupBy(c => c);
var results = analysis.OrderByDescending(group => group.Count())
                      .ThenBy(group => group.Key)
                      .Select(group => "The character \""
                                       + group.Key
                                       + "\" appears "
                                       + group.Count()
                                       + " time"
                                       + (group.Skip(1).Any() ? "s" : String.Empty)
                                       + ".");
于 2012-10-19T13:55:02.780 に答える
0

これを試すことができます。

 public DataTable GetDataTableFromTextFile(string filepath) 
    {
                                string line;
                                DataTable dt = new DataTable();                         
                                using (TextReader tr = File.OpenText(filepath))
                                {
                                    while ((line = tr.ReadLine()) != null)
                                    {
                                        string[] items = line.Split('\t',":",";","=");
                                        if (dt.Columns.Count == 0)
                                        {
                                            dt.Columns.Add(new DataColumn("FirstColumn", typeof(string)));
                                            dt.Columns.Add(new DataColumn("SecondColumn", typeof(string)));
                                            dt.Columns.Add(new DataColumn("ThridColumn", typeof(string)));

                                        }

                                        if (items.Length > 0 && !string.IsNullOrWhiteSpace(items[0].ToString()))
                                        {
                                            dt.Rows.Add(items);                                       
                                        }
                                    }
                                }
    return dt;

}
于 2012-10-19T14:03:22.280 に答える