C# 解析文件名排列
我正在尝试将.CSV文件导入到我的数据库中,该数据库是从图像管理系统导出的表。该系统允许最终用户拍摄图像,并(有时)将其分割为多个图像。此报告中有一列表示我正在跟踪的图像的文件名。如果在图像管理系统中拆分项目,则文件名将在报告上显示下划线(“389;”)。不保留以前的文件名。项目可能存在于CSV上的方式如下所示:C# 解析文件名排列,c#,permutation,C#,Permutation,我正在尝试将.CSV文件导入到我的数据库中,该数据库是从图像管理系统导出的表。该系统允许最终用户拍摄图像,并(有时)将其分割为多个图像。此报告中有一列表示我正在跟踪的图像的文件名。如果在图像管理系统中拆分项目,则文件名将在报告上显示下划线(“389;”)。不保留以前的文件名。项目可能存在于CSV上的方式如下所示: Report 1 @ 8:00AM: ABC.PNG Report 2 @ 8:30AM: ABC_1.PNG ABC_2.PNG
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
我正在将每个文件名导入到它自己的记录中。拆分项目时,我希望标识以前的版本并更新原始记录,然后将新的拆分记录添加到我的数据库中。知道项目是否被拆分的关键是定位下划线(“\ux”)
我不确定我应该做什么来重新创建以前的子名称,我必须测试文件名的每个以前的迭代,看看它是否存在。我的问题是解释文件名的当前状态并重建所有以前的可能性。我不需要原始名称,只需要第一个可能的拆分名称,直到当前名称。下面的代码显示了我的意思,但我不确定如何干净利落地做到这一点
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[]splitName=theStringToSplit.Split(“”);
for(int i=1;i
您要查找的东西是字符串的一部分。
因此string.Join()
可能有助于将数组连接到分隔字符串:
它还包含一个参数start index和要使用的项数
string[] s = new string[] { "2", "a", "b" };
string joined = string.Join("_", s, 0 ,3);
// joined will be "2_a_b"
也许你用错了工具来解决你的问题。如果要保留最后一个“\ux”,可能需要使用LastIndexOf()
甚至正则表达式。无论如何:你不应该不必要地撕开名字,然后重新粘上它们。如果这样做了,就要做到文化不变性,而不是文化特定性(可能对“-”或低字母“I”有不同的解释)。
字符串fnwithExt=“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);