スプレッドシートギアを使用して、ヘッダー行 (存在する場合) を除いて、列の「可能性の高い」データ型を取得する方法はありますか?自分でサンプルを作成することなく、まばらな母集団に適度に寛容です...すでに方法はありますか?これをする?
たとえば、次のようなExcel行があるとします
| Customers | Sales Item | Sale Date | Contact | Quantity |
| IBM | Keyboard | 28-10-2011 | | 2 |
| MS | Mouse | 27-09-2011 | joe | 5 |
私は見ることを期待します
文字列、文字列、日時、文字列、数値
編集
そのため、@Tim Andersonが提案したようにサンプリングする必要がありましたが、スパースデータのケースを処理する必要があり、列の型が競合する場合はデフォルトで文字列を使用する必要がありました. (これは、列をたどるループで呼び出されます。IP が含まれているため投稿できません) DataValueType は単なるローカル列挙型であり、rowcount はサンプリングする行数です。すでにサンプリングしているため、行 0 を単に無視します。ヘッダー行の場合。
private DataType GetDataTypeFromColRange(IRange range, int rowcount, int col)
{
var dtlist = GetValueTypes(range, rowcount, col).Distinct();
// If conflicting types for the col default to string.
if (dtlist.Count() != 1)
{
return new DataType(DataTypeValue.String);
}
else
{
return new DataType(dtlist.First());
}
}
private IEnumerable<DataTypeValue> GetValueTypes(IRange range, int rowcount, int col)
{
for (int i = 1; i < rowcount; i++)
{
switch (range[i, col].ValueType)
{
case SpreadsheetGear.ValueType.Text:
yield return DataTypeValue.String;
break;
case SpreadsheetGear.ValueType.Number:
if (range[i, col].NumberFormatType == NumberFormatType.Date || range[i, col].NumberFormatType == NumberFormatType.DateTime)
{
yield return DataTypeValue.Date;
}
else
{
yield return DataTypeValue.Numeric;
}
break;
case SpreadsheetGear.ValueType.Logical:
yield return DataTypeValue.Bool;
break;
default: // ignore empty or errored cells.
continue;
}
}
}
これはさらに改善できると確信しているので、お気軽に改善を投稿してください。