C# C语言中字符串数组解析的数据类型识别#
是否有一个库可以帮助识别给定字符串数组中的数据类型,例如C# C语言中字符串数组解析的数据类型识别#,c#,parsing,type-conversion,C#,Parsing,Type Conversion,是否有一个库可以帮助识别给定字符串数组中的数据类型,例如 {"1.0", "2.0", "3.0"} ==> float, double, decimal (I do not care as long it is a real number) {"1.0", "AB", "A"} ==> string {1, 2, 3, 4} ==> Int32 {1.0, 2.5, 1, 2, 3} ==> float/double/decimal 识别给定类型的最小表示形式
{"1.0", "2.0", "3.0"} ==> float, double, decimal (I do not care as long it is a real number)
{"1.0", "AB", "A"} ==> string
{1, 2, 3, 4} ==> Int32
{1.0, 2.5, 1, 2, 3} ==> float/double/decimal
识别给定类型的最小表示形式(例如,float代替double或short代替int)是一种优势,但不是必要的
需要识别的一些附加数据类型:DateTime(可能的格式很少),+/-符号表示前缀或后缀,小数点表示为点或逗号,等等
我需要创建一个类似于Excel导入向导的功能,其中输入时我有一个csv文本文件,系统应该为每个列建议数据类型。我认为最好的方法是从“最小”到“最大”转换到所需的每种可能类型。大概是这样的:
IList<object> dataTypeArr = new List<object>
{
1.0,
"AB",
"A",
DateTime.Now
};
var typeList2 = new List<object>();
foreach (var item in dataTypeArr)
{
typeList2.Add(item.GetType());
}
void SetColumnType(string inputString)
{
bool boolValue;
short shortValue;
int intValue;
float floatValue;
if (bool.TryParse(inputString, out boolValue))
{
// set that column type or whatever to int
}
else if (short.TryParse(inputString, out shortValue))
{
// ... to short
}
else if (int.TryParse(inputString, out intValue))
{
// ... to int
}
else if (float.TryParse(inputString, out floatValue))
{
// ... to float
}
// ... etc.
}
如果要将这些值转换为它们必须精确的表示形式,则需要存储它们并将它们返回给调用者,调用者将是
object
类型数组,而我们没有完成任何操作。您可以依次对更多“常规”类型(short->int->float->double,比方说)执行一系列TryParse
直到您找到一个成功的,并且如果没有一次尝试成功,则返回字符串。@OrelEraki,是的,我知道这一点,但我可以存储类型,然后在代码中使用它。搜索句点,如果有,那么我们有一个float/double if not检查它是否是数字…如果是,那么我们有一个整数,如果不是字符串。@SebastianWidz如果你将数组转换成一个列表,这可以完成,然后从那里你可以确定列表中每个元素的数据类型。我上周刚刚发布了一个例子,我将调整我的答案以适用当您无法将字符串[]转换为字符串
时,您所有的示例都显示了这一点。。?您不应该发布不起作用的代码,特别是当OP明确询问{}
字符串数组时,然后遍历字符串数组。这不是一个好例子。也许您应该编辑它并确保它起作用
void SetColumnType(string inputString)
{
bool boolValue;
short shortValue;
int intValue;
float floatValue;
if (bool.TryParse(inputString, out boolValue))
{
// set that column type or whatever to int
}
else if (short.TryParse(inputString, out shortValue))
{
// ... to short
}
else if (int.TryParse(inputString, out intValue))
{
// ... to int
}
else if (float.TryParse(inputString, out floatValue))
{
// ... to float
}
// ... etc.
}