0

我从 excel 中读取的地址字段不一致。我需要拆分此字段并将这两个值输入到两个列表属性中。

内容可能是这样的

在门口 42

我需要将数字与其他数字分开,并将“At the gates”添加到属性“Street”,将“42”添加到属性“number”

我用这个号码解决了这个问题:

Number = Convert.ToString(ws.Cells[j + 3, i + 2].Value).Split(' ').LastOrDefault()

如何使用 Linq 拆分此字符串并仅排除最后一个数字以获取街道?

亲切的问候

4

4 回答 4

2

在这里拆分字符串有点过分。您只需要找到“”的最后一次出现并在此位置拆分:

var address = "At the gates 42";
var idx = address.LastIndexOf(' ');
var street = address.Substring(0, idx);
var number = address.Substring(idx + 1);

如果您需要更大的灵活性,还可以考虑使用正则表达式。

于 2013-06-13T11:40:23.863 回答
2

使用正则表达式,因此您也可以灵活地满足您的需求。

这是一个示例:

    static void Main(string[] args)
    {
        Regex regex = new Regex(@"(?<words>[A-Za-z ]+)(?<digits>[0-9]+)");

        string input = "At the gates 42";

        var match = regex.Match(input);
        var a = match.Groups["words"].Value; //At the gates 
        var b = match.Groups["digits"].Value; //42
    }
于 2013-06-13T11:46:22.800 回答
0

你可以这样做:

String[] sa = Convert.ToString(ws.Cells[j + 3, i + 2].Value).Split(' ');
Int32 number = Convert.ToInt32(sa[sa.Length - 1]);
String street = String.Join(" ", sa.Take(sa.Length - 1));
于 2013-06-13T11:42:58.190 回答
0

我会为此使用 LastIndexOf (如果您可以安全地假设您的门牌号码没有空格):

var original = Convert.ToString(ws.Cells[j + 3, i + 2].Value).Split().LastOrDefault()
var street = original.Substring(1, original.LastIndexOf(' '))
var number = original.Substring(original.LastIndexOf(' ') + 1)

请注意,让 Excel 为您完成工作可能更容易,您可以在工作表中使用公式来执行相同的功能,所以...

这为您提供街道名称(假设您的原始值在单元格 A1 中,否则只需替换所有出现的 A1):

=MID(A1,1,LOOKUP(9.9999999999E+307,FIND(" ",A1,ROW($1:$1024)))-1)

这给了你号码:

=MID(A1,LOOKUP(9.9999999999E+307,FIND(" ",A1,ROW($1:$1024)))+1,LEN(A1))
于 2013-06-13T11:44:19.773 回答