解析文件名排列

本文关键字:排列 文件名 | 更新日期: 2023-09-27 17:50:14

我试图导入。csv文件到我的数据库中,这是一个表从图像管理系统导出。该系统允许最终用户拍摄图像并(有时)将它们分割成多个图像。该报告中有一列表示我正在跟踪的图像的文件名。如果项目在图像管理系统中被分割,那么文件名将在报告中接受下划线("_")。不保留之前的文件名。条目在CSV上可能存在的方式如下所示:

Report 1 @ 8:00AM:  ABC.PNG
Report 2 @ 8:30AM:  ABC_1.PNG
                    ABC_2.PNG 
 Report 3 @ 9:00AM: ABC_1_1.PNG 
                    ABC_1_2.PNG
                    ABC_2_1.PNG
                    ABC_2_2.PNG 
Report 4 @ 9:30AM   ABC_1_1_1.PNG
                    ABC_1_1_2.PNG
                    ABC_1_2.PNG
                    ABC_2_1.PNG
                    ABC_2_2.PNG 

我将每个文件名导入到它自己的记录中。当一个项目被分割时,我想识别以前的版本并更新原始记录,然后将新的分割记录添加到我的数据库中。知道条目是否被分割的关键是找到下划线("_")。

我不确定我应该做什么来重新创建以前的子名称,我必须测试文件名的每个以前的迭代,看看它是否存在。我的问题是解释文件名的当前状态并重建所有以前的可能性。我不需要原始名称,只需要第一个可能的拆分名称直到当前名称。下面的代码显示了我想要的东西,但我不确定如何干净利落地做到这一点。

String[] splitName = theStringToSplit.Split('_');
for (int i = 1; i < splitName.Length - 1; i++)
{
    //should concat everything between 0 and i, not just 0 and I
    //not sure if this is the best way or what I should do
    MessageBox.Show(splitName[0] + "_" + splitName[i] + ".PNG");
}

解析文件名排列

您要查找的东西是字符串的一部分。所以string.Join()可以帮助你将一个数组连接到一个分隔的字符串:它还包含一个参数、开始索引和要使用的项数。

string[] s = new string[] { "2", "a", "b" };
string joined = string.Join("_", s, 0 ,3);
// joined will be "2_a_b"   

也许你使用错误的工具来解决你的问题。如果你想保留最后一个"_",你可能想使用LastIndexOf()甚至正则表达式。无论如何:你不应该不必要地撕下名字并重新粘合它们。如果这样做了,要做到文化不变,而不是文化特定("-"或"I"的小写字母可能有不同的解释)。string fnwitheext = "Abc_12_23.png";

        string fn = System.IO.Path.GetFileName(fnwithExt);
        int indexOf = fn.LastIndexOf('_');
        string part1 = fn.Substring(0, indexOf-1);
        string part2 = fn.Substring(indexOf+1);
        string part3 = System.IO.Path.GetExtension(fnwithExt);
        string original = System.IO.Path.ChangeExtension(part1 + "_"+ part2, part3);