C#,Substring如何使用子字符串访问数组/字符串的最后一个元素

时间:2011-10-03 14:42:26

标签: c#

我正在生成35个名称为ar15220110910, khwm20110910的字符串,依此类推。

该字符串包含ID (ar152,KHWM)的名称和日期(20110910)。我想从字符串中提取Id, date并将其存储在名为StatSummary的文本文件中。

我的代码声明是这样的

for( int 1= 0;i< filestoextract.count;1++)
{
    // The filestoextract contains 35 strings
    string extractname = filestoextract(i).ToString();  
    statSummary.writeline( extractname.substring(0,5) + "" + 
         extractname.substring(5,4) + "" + extractname.substring(9,2) + "" + 
         extractname.substring(11,2));
}

当工作站的Id包含5个字母时,此代码正确执行,但当工作站ID为KHWM或任何其他4个字母名称时,插入全部搞砸了。我在循环中运行它。所以我尽量保持代码尽可能动态。任何人都可以帮我找到一种没有硬编码的方法。例如访问最后8个元素来获取日期???我已经搜索过,但无法找到办法。

5 个答案:

答案 0 :(得分:3)

对于最后8位数字,它只是:

extractname.Substring(extractname.Length-8)
哦,我很抱歉,因为您的代码可能是:

int l = extractname.Length;
statSummary.WriteLine(extractname.substring(0,l-8) + "" + 
         extractname.Substring(l-8,4) + "" + extractname.Substring(l-4,2) + "" + 
         extractname.Substring(l-2,2));

答案 1 :(得分:2)

由于您的ID长度不一致,提取日期(总是8个字符)可能是更好的选择,然后将余数视为您的ID,例如。

更新 - 通过基于格式实际计算日期的长度来更加健壮。还要对格式进行验证,以确保正确解析数据。

var dateFormat = "yyyyMMdd"; // this could be pulled from app.config or some other config source

foreach (var file in filestoextract)
{
    var dateStr = file.Substring(file.Length-dateFormat.Length);
    if (ValidateDate(dateStr, dateFormat))
    {
        var id = file.Substring(0, file.Length - (dateFormat.Length+1));
        // do something with data
    }
    else
    {
        // handle invalid filename
    }
}

public bool ValidateDate(stirng date, string date_format)
{
    try
    {
        DateTime.ParseExact(date, date_format, DateTimeFormatInfo.InvariantInfo);
    }
    catch
    {
        return false;
    }
    return true;    
}

答案 2 :(得分:1)

您可以使用正则表达式:

match = Regex.Match ("khwm20110910","(?<code>.*)(?<date>.{6})" );
Console.WriteLine (match.Groups["code"] );
Console.WriteLine (match.Groups["date"] );

要解释正则表达式模式(?<code>.*)(?<date>.{6}),括号组会为每个模式创建一个组。 ?<code>为该群组命名,以便您轻松引用该群组。

date组获取字符串的最后六个字符。 .表示接受任何字符,{6}表示这样做六次。

code组获取所有剩余的字符。 *表示尽可能多地使用字符。

答案 3 :(得分:1)

for each(string part in stringList)

{
    int length = part.Length;
    int start = length - 8;
    string dateString = part.Substring(start, 8);
}

那应该解决变量长度来获取日期。拉的其余部分很可能取决于模式(建议)或字符串的长度(当x然后调用长度为4时等)

答案 4 :(得分:0)

如果您的ID不总是相同数量的字母,您应该使用','或其他东西分隔ID和日期,然后使用它:

for( int 1= 0;i< filestoextract.count;1++)
{
    string extractname = filestoextract[i].ToString();
    string ID = extractname.substring(0, extractname.IndexOf(','));
    string Date = extractname.substring(extractname.IndexOf(','));
    Console.WriteLine(ID + Date);
}