private SiffEntity ReadToSiffEntity(FileInfo fileInfo)
{
SiffEntity siffentity = new SiffEntity();
// “*”表示其前的内容出现零次或多次,"\s"表示任意一个空白字符 如\n、\s之类的, "()"将括号内的内容组合成一个独立的单元 还有一个捕获和非捕获的作用
// “+”表示其前的内容出现一次或多次
string testprogram_pattern = @"Device Name *: (\S*)";
// “|”表示“或”,“[0-9A-Z]”表示任何一个字符 小数点后的信息没有录入
string lotno_pattern = @"(LOT|Lot No.|LotNo) *: ([0-9A-Z]*)";
// “/s”表示任意一个空白字符 但是/S表示任意一个非空白字符!!!!
// 模式与1061格式不匹配 1061的ID数字并未固定为两位数
//string waferid_pattern = @"Wafer ID *: \S*-(\d{2})";
string waferid_pattern = @"Wafer ID *: \S*-(\d*)";
// “\w”表示任意一个由 数字、大小写字母和下划线 组成的单词
string flat_pattern = @"Flat/Notch *: (\w*)";
string operator_pattern = @"Operator Id *: (.*)";
string probercard_pattern = @"Card Id *: (.*)";
string loadboard_pattern = @"Tester id *: (.*)";
string station_pattern = @"Probe id *: (.*)";
string measuretime_pattern = @"Testing Finish *: (.*)";
// 行列数正则表达式
string col_pattern = @"Map Column *: ([1-9]*)";
string row_pattern = @"Map Row *: ([1-9]*)";
// 正则表达式捕获的字符串
string col_string = "";
string row_string = "";
// FileShare用于控制其他线程或进程能否同时访问该文件 Read表示只读
using (FileStream fs = new FileStream(fileInfo.FullName, FileMode.Open, FileAccess.Read, FileShare.Read))
// 逐行读取
using (StreamReader reader = new StreamReader(fs))
{
//添加布尔值判断是否在读wafer map
bool isReadingWaferMap = false;
while (!reader.EndOfStream)
{
//20251127王豪豪修改:修改读取逻辑为,从[WAFER MAP]开始,到[BIN DEFINATION]结束
var lineContent = reader.ReadLine().Trim();
// 检测标记行并更新状态
if (Regex.IsMatch(lineContent, @"^\[ WAFER MAP\]$", RegexOptions.IgnoreCase))
{
isReadingWaferMap = true;
continue; // 跳过标记行
}
if (Regex.IsMatch(lineContent, @"^\[ BIN SUMMARY\]$", RegexOptions.IgnoreCase))
{
isReadingWaferMap = false;
// 不break,继续处理后续内容
}
// RegexOptions.Ignore 表示不区分大小写
if (Regex.IsMatch(lineContent, testprogram_pattern, RegexOptions.IgnoreCase))
// “.Groups[1]”输出"()"的捕获功能 表示输出第一个捕获结果
siffentity.TestProgram = Regex.Match(lineContent, testprogram_pattern, RegexOptions.IgnoreCase).Groups[1].ToString();
else if (Regex.IsMatch(lineContent, lotno_pattern, RegexOptions.IgnoreCase))
siffentity.Lot = Regex.Match(lineContent, lotno_pattern, RegexOptions.IgnoreCase).Groups[2].ToString();
else if (Regex.IsMatch(lineContent, waferid_pattern, RegexOptions.IgnoreCase))
siffentity.WaferNumber = Regex.Match(lineContent, waferid_pattern, RegexOptions.IgnoreCase).Groups[1].ToString();
else if (Regex.IsMatch(lineContent, flat_pattern, RegexOptions.IgnoreCase))
siffentity.FlatOrientation = Regex.Match(lineContent, flat_pattern, RegexOptions.IgnoreCase).Groups[1].ToString();
else if (Regex.IsMatch(lineContent, operator_pattern, RegexOptions.IgnoreCase))
siffentity.Operator = Regex.Match(lineContent, operator_pattern, RegexOptions.IgnoreCase).Groups[1].ToString();
else if (Regex.IsMatch(lineContent, probercard_pattern, RegexOptions.IgnoreCase))
siffentity.ProbeCard = Regex.Match(lineContent, probercard_pattern, RegexOptions.IgnoreCase).Groups[1].ToString();
else if (Regex.IsMatch(lineContent, loadboard_pattern, RegexOptions.IgnoreCase))
siffentity.LoadBoard = Regex.Match(lineContent, loadboard_pattern, RegexOptions.IgnoreCase).Groups[1].ToString();
else if (Regex.IsMatch(lineContent, station_pattern, RegexOptions.IgnoreCase))
siffentity.Station = Regex.Match(lineContent, station_pattern, RegexOptions.IgnoreCase).Groups[1].ToString();
// 读取行列数
else if (Regex.IsMatch(lineContent, col_pattern, RegexOptions.IgnoreCase))
col_string = Regex.Match(lineContent, col_pattern, RegexOptions.IgnoreCase).Groups[1].ToString();
else if (Regex.IsMatch(lineContent, row_pattern, RegexOptions.IgnoreCase))
row_string = Regex.Match(lineContent, row_pattern, RegexOptions.IgnoreCase).Groups[1].ToString();
else if (Regex.IsMatch(lineContent, measuretime_pattern, RegexOptions.IgnoreCase))
{
// 处理时间文本
string measureTimeString = Regex.Match(lineContent, measuretime_pattern, RegexOptions.IgnoreCase).Groups[1].ToString();
if (measureTimeString.Length == 14)
{
siffentity.MeasureTime = ("20" + measureTimeString).Replace(" ", "_").Replace("-", "/") + ":00";
}
else if (measureTimeString.Length == 17)
{
siffentity.MeasureTime = ("20" + measureTimeString).Replace(" ", "_").Replace("-", "/");
}
else if (measureTimeString.Length == 16)
{
siffentity.MeasureTime = measureTimeString.Replace(" ", "_").Replace("-", "/") + ":00";
}
else
{
siffentity.MeasureTime = (measureTimeString).Replace(" ", "_").Replace("-", "/");
}
}
// 开始处理晶圆map的内容
// 不包含“=”且不由空白字符组成,且正在读取wafermap与bin定义中间的内容
else if (isReadingWaferMap && !lineContent.Contains("=") && !string.IsNullOrWhiteSpace(lineContent))//1.修改读取逻辑
{
// 获取 BinDefinition
if (siffentity.BinDefinition == null)
{
// 需要设置csv文件名的格式
// substring 返回前四个字符
// 在Translaotor10中直接写入完整的csv文件地址
//string bindefFile = Path.Combine(BinDefinitionFolder, string.Format("{0} Jade Bin Definiton.csv", siffentity.Product.Substring(0, 4)));
string bindefFile = Path.Combine(BinDefinitionFolder, "0851-CP1.csv");
// read的是CSV文件
siffentity.BinDefinition = ReadBinDefinition(bindefFile);//2.修改读取bindef文件格式为csv
}
// 处理晶圆内容
StringBuilder sb = new StringBuilder();
// 对每行的每个字符进行处理
foreach (var c in lineContent)
{
string cString = c.ToString();
if (siffentity.BinDefinition.Keys.Contains(cString))
{
string binNum = siffentity.BinDefinition[cString].BinNumber;
// BinSummary是用来统计各项总数的?
if (siffentity.BinSummary.ContainsKey(binNum))
{
siffentity.BinSummary[binNum]++;
}
else
{
siffentity.BinSummary.Add(binNum, 1);
}
// sb是用来记录单行的
sb.Append(binNum);
}
else if (NoValueDieCharArray.Contains(cString))
{
sb.Append(SiffEntity.NoValueDie);
}
else if (NoDieCharArray.Contains(cString))
{
sb.Append(SiffEntity.NoDie);
}
else
{
string binNumber = GetBinNumber(cString);
if (!binNumber.Equals(""))
{
//定义为出现在Bindef中的Bin
BinDef binDef = new BinDef()
{
BinName = cString,
BinSpec = "B",
BinNumber = binNumber,
Description = cString + "?"
};
siffentity.BinDefinition.Add(cString, binDef);
siffentity.BinSummary.Add(binNumber, 1);
sb.Append(binNumber);
}
}
}
siffentity.WaferMapStr.Add(sb.ToString());
}
}
}
// 检测行数列数是否匹配
if (siffentity.Columns != col_string)
throw new Exception(string.Format("Map列数不匹配!map文件显示列数为{0},实际列数为{1}", col_string,siffentity.Columns));
if (siffentity.Rows != row_string)
throw new Exception(string.Format("Map行数不匹配!map文件显示行数为{0},实际行数为{1}", row_string, siffentity.Rows));
return siffentity;
}
详解上述code
最新发布