如何更新基于文件名的文件名 其他两列中文件名的最大值

本文关键字:文件名 两列 最大值 中文 其他 何更新 更新 | 更新日期: 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
           );