如何更新基于文件名的文件名 其他两列中文件名的最大值
本文关键字:文件名 两列 最大值 中文 其他 何更新 更新 | 更新日期: 2023-09-27 18:24:09
我需要根据其他两列中文件名的最高名称更新文件名。例如:- 我有名为 221-8812_01
的 coumn3 和名为 221-8812_02
的列 4。所以我想将221-8812_02
文件名更新为 column1。
反之亦然,如果我在第 3 列中有一个名为 323-1111_03
的文件名,在第 3 列中有一个名为 323-1111_02
的文件名,那么我想在第 1 列中更新 323-1111_03。
注意:- 我有 323-2332_0A 和 323-2332_0B 这样的文件名,所以我需要更新第 323 列中的 1-2332_0B。或者可能是 111-4334_0D 和 111-4334_0C,所以我需要更新111-4334_0D
到第 1 列。
所以它就像第一个断线数字保持不变。 在七个数字之后..当(_(下划线开始时.. 我需要比较.. 根据字母或数字的递增顺序!!!我该怎么做,
我的代码片段:
private void filter_table()
{
// create a check box in column0
DataGridViewCheckBoxColumn colCB = new DataGridViewCheckBoxColumn();
DatagridViewCheckBoxHeaderCell cbHeader = new DatagridViewCheckBoxHeaderCell();
colCB.HeaderCell = cbHeader;
dataGridView1.Columns.Add(colCB);
//Initialize Directory path
string draft = ini.ReadValue("Location", "Draft");
string release = ini.ReadValue("Location", "Release");
string drawing = ini.ReadValue("Location", "Drawing");
string archive = ini.ReadValue("Location", "Archive");
if (!System.IO.Directory.Exists(draft))
System.IO.Directory.CreateDirectory(draft);
if (!System.IO.Directory.Exists(release))
System.IO.Directory.CreateDirectory(release);
if (!System.IO.Directory.Exists(drawing))
System.IO.Directory.CreateDirectory(drawing);
if (!System.IO.Directory.Exists(archive))
System.IO.Directory.CreateDirectory(archive);
string[] arrDraft = Directory.GetFiles(draft, "*", SearchOption.AllDirectories);
string[] arrRelease = Directory.GetFiles(release, "*", SearchOption.AllDirectories);
string[] arrDrawing = Directory.GetFiles(drawing, "*", SearchOption.AllDirectories);
string[] arrArchive = Directory.GetFiles(archive, "*", SearchOption.AllDirectories);
dt.Columns.Add("Drawing_Number");
//dt.Columns["Part Number"].ReadOnly = true;
dt.Columns.Add("Drawing");
// dt.Columns["Drawing"].ReadOnly = true;
dt.Columns.Add("Draft Path");
// dt.Columns["Draft Path"].ReadOnly = true;
dt.Columns.Add("Release Path");
// dt.Columns["Release Path"].ReadOnly = true;
dt.Columns.Add("Error");
// dt.Columns["Error"].ReadOnly = true;
dt.Columns.Add("Archive");
// listing all the files according to the column3(draft path) filename.. and mating files from nearby column.
List<FileDetails> lst = new List<FileDetails>();
foreach (string file in arrDraft)
{
Finder finder = new Finder(Path.GetFileNameWithoutExtension(file).Substring(0, 7));
string abc = Array.Find(arrRelease, finder.Match);
string cdf = Array.Find(arrDrawing, finder.Match);
string ghi = Array.Find(arrArchive, finder.Match);
dt.Rows.Add(Path.GetFileNameWithoutExtension(file), cdf, file, abc, String.Empty, ghi);
}
dataGridView1.DataSource = dt;
}
private void Form1_Load(object sender, EventArgs e)
{
filter_table();
}
// Search predicate returns true if a string ends in "saurus".
private static bool MatchFileName(String s, String _match)
{
return ((s.Length > 5) && (s.Substring(0, 7).ToLower() == _match.ToLower()));
}
public class FileDetails
{
public string FileName;
public string Drawings;
public string FilePathDraft;
public string FilePathRelease;
public string Comment;
public string ErrorMsg;
}
public sealed class Finder
{
private readonly string _match;
public Finder(string match)
{
_match = match.ToLower();
}
//findin the match and showing in grid view
public bool Match(string s)
{
string fileName = s.Substring(s.LastIndexOf("''") + 1);
return ((fileName.Length > 5) && (fileName.Substring(0, 8).ToLower() == _match));
}
}
让我们让它变得简单
string A = "323-1111_0A";
string B = "323-1111_0D";
MessageBox.Show(TakeLarger(A, B));
private string TakeLarger(string first, string second)
{
int iResult = first.Substring(first.LastIndexOf("_")+1).CompareTo(second.Substring(second.LastIndexOf("_")+1));
return (iResult == -1) ? second : first;
}
输出:
323-1111_0D
如果最后两位数字是十六进制值,则可以使用此方法。
string A = "323-1111_FF";
string B = "323-1111_1D";
MessageBox.Show(TakeLarger(A, B));
private string TakeLargerHex(string first, string second)
{
int iFirst = Convert.ToInt32(first.Substring(first.LastIndexOf("_")+1), 16);
int iSecond = Convert.ToInt32(second.Substring(second.LastIndexOf("_")+1), 16);
return (iFirst > iSecond) ? first : second;
}
输出:
323-1111_FF
如果文件名在网格单元格中像MY_FILE_323-1111_FF.doc
一样是STORD,那么您需要从末尾删除扩展名,否则可以直接使用。
string A = dataGridView.Rows[i].Cells[2].Value.ToString();
string B = dataGridView.Rows[i].Cells[3].Value.ToString();
如果扩展名包含在字符串的末尾,则可以像这样删除。
A = A.Substring(A.LastIndexOf(".")+1);
我已经敲出了一个快速简单的方法来比较 2 个字符串并确定哪个更高,根据您的逻辑。
请注意:
- 您可能希望修改此代码并实现 IComparable
- 如果您希望将代码用作静态方法,如下所示,则需要处理两个字符串相等的情况
- 如果您确信前 7 个数字始终相同,则可以省略该逻辑
-
我的逻辑假设位置是固定的。如果位置是动态的,则需要修改代码以使用字符串搜索下划线。IndexOf("_"(
// returns true if a is "higher" than b // example string format 323-2332_0A private static bool IsHigher(string a, string b) { if(string.CompareOrdinal(a.ToUpper(), b.ToUpper()) == 0) throw new InvalidOperationException("The strings are equal!"); // Compare first 3 numbers var inta = Convert.ToInt32(a.Substring(0, 3)); var intb = Convert.ToInt32(b.Substring(0, 3)); var result = inta.CompareTo(intb); if (result > 0) return true; // a is "higher" than b if (result < 0) return false; // b is "higher" than a // if a = b, code continues down ... // Compare middle 4 numbers inta = Convert.ToInt32(a.Substring(4, 4)); intb = Convert.ToInt32(b.Substring(4, 4)); result = inta.CompareTo(intb); if (result > 0) return true; // a is "higher" than b if (result < 0) return false; // b is "higher" than a // if a = b, code continues down ... // Compare last number inta = Convert.ToInt32(a.Substring(9, 1)); intb = Convert.ToInt32(b.Substring(9, 1)); result = inta.CompareTo(intb); if (result > 0) return true; // a is "higher" than b if (result < 0) return false; // b is "higher" than a // if a = b, code continues down ... // Compare alphabet var stringa = a.Substring(10, 1).ToUpper(); var stringb = b.Substring(10, 1).ToUpper(); result = String.CompareOrdinal(stringa, stringb); if (result > 0) return true; // a is "higher" than b if (result < 0) return false; // b is "higher" than a return true; // we should not get here. }
编辑
在将行添加到数据网格之前,您可能会使用此代码。
例如,如果要将字符串与当前文件名进行比较,并且只选择"更高"的文件名,则可以执行此操作。
Finder finder = new Finder(Path.GetFileNameWithoutExtension(file).Substring(0, 7));
string abc = Array.Find(arrRelease, finder.Match);
string cdf = Array.Find(arrDrawing, finder.Match);
string ghi = Array.Find(arrArchive, finder.Match);
var filenameonly = Path.GetFileNameWithoutExtension(file);
dt.Rows.Add(filenameonly,
IsHigher(filenameonly, cdf) ? filenameonly : cdf,
file,
IsHigher(filenameonly, abc) ? filenameonly : abc,
String.Empty,
IsHigher(filenameonly, ghi) ? filenameonly : ghi
);