我需要根据其他两列中文件名的最高名更新文件名。
例如: - 我有一个名为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这样的文件名。所以我需要更新column1中的323-2332_0B。
或者可能是111-4334_0D和111-4334_0C 所以我需要将111-4334_0D
更新为column1。
所以它的第一个服务器号码保持不变。七个数字之后...当(_)下划线开始时...我需要比较..根据字母或数字递增顺序 !!!! 我怎么能这样做,
我的代码段:
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));
}
}
答案 0 :(得分:1)
根据你的逻辑,我已经找到了一种快速而简单的方法来比较2个字符串并确定哪个更高。
请注意:
我的逻辑假设职位是固定的。如果头寸是动态的,您需要修改代码以使用string.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.
}
修改强>
在将行添加到datagrid之前,您可能会使用此代码。
例如,如果您想将字符串与当前文件名进行比较,并且只选择“更高”字符串,则可以执行此操作。
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
);
答案 1 :(得分:1)
让它变得简单
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
,那么您需要从末尾删除扩展名,否则您可以直接删除。
string A = dataGridView.Rows[i].Cells[2].Value.ToString();
string B = dataGridView.Rows[i].Cells[3].Value.ToString();
如果扩展名包含在字符串的末尾,那么您可以像这样删除。
A = A.Substring(A.LastIndexOf(".")+1);