} //end of tvDataList_Click // *** Open and Cache Test Data from AceTech private DataTable[] FetchAceTechCsvData(string strFileName) { DataParse _DP = new DataParse(); DataTable[] tblResult = new DataTable[2]; DataHeader m_Header = new DataHeader(); DataTable tblHeadResult = new DataTable(); DataTable tblDataResult = new DataTable(); DataTable[] tblTestData = new DataTable[6]; string[] ArrayKGU = null; try { tblTestData = _DP.GetDataFromAceTechCsv(strFileName); intFrozenColumn = _DP.FreezeColumn; _DataParse = _DP; if (_DP.a_Header.KGU) ArrayKGU = _DP.a_Header.KGU_Number.Split(','); #region --- Cache Data --- #region --- Common Header --- m_Header.Handler = _DP.a_Header.Handler; m_Header.LotFinishDateTime = _DP.a_Header.LotEndDateTime; m_Header.LotID = _DP.a_Header.LotNumber; m_Header.LotStartDateTime = _DP.a_Header.LotStartDateTime; m_Header.OperatorID = _DP.a_Header.OperatorID; m_Header.Product = _DP.a_Header.Product; m_Header.ProgramRev = _DP.a_Header.ProgramRev; m_Header.SubLotID = _DP.a_Header.SubLotNumber; m_Header.TestBoard = _DP.a_Header.TestBoard; m_Header.Tester = _DP.a_Header.Tester; m_Header.LotQuantity = _DP.a_Header.LotQty; m_Header.TestSession = _DP.a_Header.TestSession; m_Header.TestQuantity = _DP.TestedDevice = _DP.a_Header.TestedQty_FT; m_Header.PassQuantity = _DP.PassedDevice = _DP.a_Header.PassedQty_FT; m_Header.FailQuantity = _DP.FailedDevice = _DP.a_Header.TestedQty_FT - _DP.a_Header.PassedQty_FT; m_Header.Yield = _DP.a_Header.Yield_FT; _DP.Header = m_Header; #endregion --- Common Header --- #region --- KGU --- if (_DP.a_Header.KGU) { m_Header.TestSession = "KGU"; m_Header.TestQuantity = _DP.TestedDevice = ArrayKGU.Length; m_Header.PassQuantity = _DP.PassedDevice = ArrayKGU.Length; m_Header.FailQuantity = _DP.FailedDevice = 0; m_Header.Yield = 100; _DP.Header = m_Header; tblData = tblTestData[0]; // Cache Data, Save tbldata to tablCacheDat // wait cache data to be finished this.CacheDataAsync(CacheDataTask("KGU")); } #endregion --- KGU --- #region --- FT --- if (_DP.a_Header.FT) { m_Header.TestSession = "FT"; m_Header.TestQuantity = _DP.TestedDevice = _DP.a_Header.TestedQty_FT; m_Header.PassQuantity = _DP.PassedDevice = _DP.a_Header.PassedQty_FT; m_Header.FailQuantity = _DP.FailedDevice = _DP.a_Header.TestedQty_FT - _DP.a_Header.PassedQty_FT; m_Header.Yield = _DP.a_Header.Yield_FT; _DP.Header = m_Header; tblData = tblTestData[1]; // Cache Data, Save tbldata to tablCacheDat // wait cache data to be finished this.CacheDataAsync(CacheDataTask("FT")); } #endregion --- FT --- #region --- RT1 --- if (_DP.a_Header.RT1) { m_Header.TestSession = "RT1"; m_Header.TestQuantity = _DP.TestedDevice = _DP.a_Header.TestedQty_RT1; m_Header.PassQuantity = _DP.PassedDevice = _DP.a_Header.PassedQty_RT1; m_Header.FailQuantity = _DP.FailedDevice = _DP.a_Header.TestedQty_RT1 - _DP.a_Header.PassedQty_RT1; m_Header.Yield = _DP.a_Header.Yield_RT1; _DP.Header = m_Header; tblData = tblTestData[2]; // Cache Data, Save tbldata to tablCacheDat // wait cache data to be finished this.CacheDataAsync(CacheDataTask("RT1")); } #endregion --- RT1 --- #region --- RT2 --- if (_DP.a_Header.RT2) { m_Header.TestSession = "RT2"; m_Header.TestQuantity = _DP.TestedDevice = _DP.a_Header.TestedQty_RT2; m_Header.PassQuantity = _DP.PassedDevice = _DP.a_Header.PassedQty_RT2; m_Header.FailQuantity = _DP.FailedDevice = _DP.a_Header.TestedQty_RT2 - _DP.a_Header.PassedQty_RT2; m_Header.Yield = _DP.a_Header.Yield_RT2; _DP.Header = m_Header; tblData = tblTestData[3]; // Cache Data, Save tbldata to tablCacheDat // wait cache data to be finished this.CacheDataAsync(CacheDataTask("RT2")); } #endregion --- RT1 --- #region --- EQC --- if (_DP.a_Header.EQC) { m_Header.TestSession = "EQC"; m_Header.TestQuantity = _DP.TestedDevice = _DP.a_Header.TestedQty_EQC; m_Header.PassQuantity = _DP.PassedDevice = _DP.a_Header.PassedQty_EQC; m_Header.FailQuantity = _DP.FailedDevice = _DP.a_Header.TestedQty_EQC - _DP.a_Header.PassedQty_EQC; m_Header.Yield = _DP.a_Header.Yield_EQC; _DP.Header = m_Header; tblData = tblTestData[4]; // Cache Data, Save tbldata to tablCacheDat // wait cache data to be finished this.CacheDataAsync(CacheDataTask("EQC")); } #endregion --- EQC --- #region --- EQCV --- if (_DP.a_Header.EQCV) { m_Header.TestSession = "EQCV"; m_Header.TestQuantity = _DP.TestedDevice = _DP.a_Header.TestedQty_EQCV; m_Header.PassQuantity = _DP.PassedDevice = _DP.a_Header.PassedQty_EQCV; m_Header.FailQuantity = _DP.FailedDevice = _DP.a_Header.TestedQty_EQCV - _DP.a_Header.PassedQty_EQCV; m_Header.Yield = _DP.a_Header.Yield_EQCV; _DP.Header = m_Header; tblData = tblTestData[5]; // Cache Data, Save tbldata to tablCacheDat // wait cache data to be finished this.CacheDataAsync(CacheDataTask("EQCV")); } #endregion --- EQCV --- #endregion --- Cache Data --- #region --- Merge Data --- m_Header.TestSession = _DP.a_Header.TestSession; m_Header.TestQuantity = _DP.TestedDevice = _DP.a_Header.TestedQty_FT; m_Header.PassQuantity = _DP.PassedDevice = _DP.a_Header.PassedQty_FT + _DP.a_Header.PassedQty_RT1 + _DP.a_Header.PassedQty_RT2; m_Header.FailQuantity = _DP.FailedDevice = _DP.TestedDevice - _DP.PassedDevice; m_Header.Yield = Math.Round((Convert.ToDouble(_DP.PassedDevice) / Convert.ToDouble(_DP.TestedDevice)) * 100, 2); _DP.Header = m_Header; int RowIndex = 1; if (_DP.a_Header.FT && _DP.a_Header.RT1 && _DP.a_Header.RT2) { #region --- Merge Data FT & RT1 & RT2 --- tblDataResult = tblTestData[1].Clone(); // FT Data tblTestData[1].PrimaryKey = null; foreach (DataRow dr in tblTestData[1].Rows) { // Header Limit if (tblTestData[1].Rows.IndexOf(dr) <= 3) tblDataResult.ImportRow(dr); int intCount = tblTestData[1].Columns.Count; if (dr[intCount - 1].ToString().ToLower() == "pass") { dr[0] = RowIndex; tblDataResult.ImportRow(dr); RowIndex++; } } // RT1 Data tblTestData[2].PrimaryKey = null; foreach (DataRow dr in tblTestData[2].Rows) { int intCount = tblTestData[2].Columns.Count; if (dr[intCount - 1].ToString().ToLower() == "pass") { dr[0] = RowIndex; tblDataResult.ImportRow(dr); RowIndex++; } } // RT2 Data tblTestData[3].PrimaryKey = null; foreach (DataRow dr in tblTestData[3].Rows) { if (tblTestData[3].Rows.IndexOf(dr) > 3) { dr[0] = RowIndex; tblDataResult.ImportRow(dr); RowIndex++; } } #endregion --- Merge Data FT & RT1 & RT2 --- } else if (_DP.a_Header.FT && _DP.a_Header.RT1) { #region --- Merge Data FT & RT1 --- // FT Data tblDataResult = tblTestData[1].Clone(); tblTestData[1].PrimaryKey = null; foreach (DataRow dr in tblTestData[1].Rows) { // Header Limit if (tblTestData[1].Rows.IndexOf(dr) <= 3) tblDataResult.ImportRow(dr); int intCount = tblTestData[1].Columns.Count; if (dr[intCount - 1].ToString().ToLower() == "pass") { dr[0] = RowIndex; tblDataResult.ImportRow(dr); RowIndex++; } } // RT1 Data tblTestData[3].PrimaryKey = null; foreach (DataRow dr in tblTestData[2].Rows) { if (tblTestData[2].Rows.IndexOf(dr) > 3) { dr[0] = RowIndex; tblDataResult.ImportRow(dr); RowIndex++; } } #endregion --- Merge Data FT & RT1 --- } else { #region --- No Merge --- if (_DP.a_Header.FT) { m_Header.TestSession = "FT"; m_Header.TestQuantity = _DP.TestedDevice = _DP.a_Header.TestedQty_FT; m_Header.PassQuantity = _DP.PassedDevice = _DP.a_Header.PassedQty_FT; m_Header.FailQuantity = _DP.FailedDevice = _DP.a_Header.TestedQty_FT - _DP.a_Header.PassedQty_FT; m_Header.Yield = _DP.a_Header.Yield_FT; _DP.Header = m_Header; tblDataResult = tblTestData[1]; } else if (_DP.a_Header.RT1) { m_Header.TestSession = "RT1"; m_Header.TestQuantity = _DP.TestedDevice = _DP.a_Header.TestedQty_RT1; m_Header.PassQuantity = _DP.PassedDevice = _DP.a_Header.PassedQty_RT1; m_Header.FailQuantity = _DP.FailedDevice = _DP.a_Header.TestedQty_RT1 - _DP.a_Header.PassedQty_RT1; m_Header.Yield = _DP.a_Header.Yield_RT1; _DP.Header = m_Header; tblDataResult = tblTestData[2]; } else if (_DP.a_Header.RT2) { m_Header.TestSession = "RT2"; m_Header.TestQuantity = _DP.TestedDevice = _DP.a_Header.TestedQty_RT2; m_Header.PassQuantity = _DP.PassedDevice = _DP.a_Header.PassedQty_RT2; m_Header.FailQuantity = _DP.FailedDevice = _DP.a_Header.TestedQty_RT2 - _DP.a_Header.PassedQty_RT2; m_Header.Yield = _DP.a_Header.Yield_RT2; _DP.Header = m_Header; tblDataResult = tblTestData[3]; } else if (_DP.a_Header.EQC) { m_Header.TestSession = "EQC"; m_Header.TestQuantity = _DP.TestedDevice = _DP.a_Header.TestedQty_EQC; m_Header.PassQuantity = _DP.PassedDevice = _DP.a_Header.PassedQty_EQC; m_Header.FailQuantity = _DP.FailedDevice = _DP.a_Header.TestedQty_EQC - _DP.a_Header.PassedQty_EQC; m_Header.Yield = _DP.a_Header.Yield_EQC; _DP.Header = m_Header; tblDataResult = tblTestData[4]; } else if (_DP.a_Header.EQCV) { m_Header.TestSession = "EQCV"; m_Header.TestQuantity = _DP.TestedDevice = _DP.a_Header.TestedQty_EQCV; m_Header.PassQuantity = _DP.PassedDevice = _DP.a_Header.PassedQty_EQCV; m_Header.FailQuantity = _DP.FailedDevice = _DP.a_Header.TestedQty_EQCV - _DP.a_Header.PassedQty_EQCV; m_Header.Yield = _DP.a_Header.Yield_EQCV; _DP.Header = m_Header; tblDataResult = tblTestData[5]; } #endregion --- No Merge --- } #endregion --- Merge Data --- #region --- KGU Analysis --- if (_DP.a_Header.KGU) { m_Header = _DP.Header; AceTechKGUVerify(tblTestData[0], ArrayKGU); _DP.Header = m_Header; } #endregion --- KGU Analysis --- #region *** Caculate Header *** //int strNameLength = 20; bool isHeadNull = false; var type = typeof(DataHeader); var fields = type.GetFields(); tblHeadResult.Columns.Add("Name", typeof(string)); tblHeadResult.Columns.Add("Value", typeof(string)); //Array.ForEach(fields, f => foreach (_FieldInfo fi in fields) { string name = fi.Name; DataRow dr = tblHeadResult.NewRow(); dr["Name"] = fi.Name; //check if header null if (name == "Product") { if (fi.GetValue(_DP.Header) == null) { isHeadNull = true; } } //if header null, use Test quantity to caculate yield if (isHeadNull) { if (name == "TestQuantity") { dr["Value"] = _DP.TestedDevice; } else if (name == "PassQuantity") { dr["Value"] = _DP.PassedDevice; } else if (name == "FailQuantity") { dr["Value"] = _DP.FailedDevice; } else if (name == "Yield") { double pass = Convert.ToDouble(_DP.PassedDevice); double total = Convert.ToDouble(_DP.TestedDevice); dr["Value"] = Math.Round(pass / total * 100, 3) + "%"; } } //if header not null, use header info else { if (name == "Yield") { dr["Value"] = fi.GetValue(_DP.Header) + "%"; } else { dr["Value"] = fi.GetValue(_DP.Header); } } tblHeadResult.Rows.Add(dr); } #endregion *** Caculate Header *** //tblData.Clear(); tblResult[0] = tblHeadResult; tblResult[1] = tblDataResult; return tblResult; } catch (Exception ex) { throw new Exception(ex.Message); } }
/// <summary> /// Save all contents of datatable into csv file /// </summary> /// <param name="fileName">Full file path to write to. (include file name)</param> /// <param name="dataTable">datatable to be writed</param> /// <param name="Header">Struct Header header information</param> /// <param name="isHasHeader">true or false</param> public void DataTableToCsv(string fileName, DataTable dataTable, DataHeader Header) { if (fileName.Length > 200) fileName = fileName.Substring(0, 200); StreamWriter swData = new StreamWriter(fileName); StringBuilder sbHeader = new StringBuilder(); StringBuilder sbTitle = new StringBuilder(); try //Try #1 { //Build test data header sbHeader.Append("Header Section,"); for (int i = 0; i < dataTable.Columns.Count - 2; i++) { sbHeader.Append(","); //补足”,“,否则import会报错 } sbHeader.AppendLine(); var type = typeof(DataHeader); var fields = type.GetFields(); Array.ForEach(fields, f => { sbHeader.Append(f.Name); sbHeader.Append(","); sbHeader.Append(f.GetValue(Header)); for (int i = 0; i < dataTable.Columns.Count - 2; i++) { sbHeader.Append(","); //补足”,“,否则import会报错 } sbHeader.AppendLine(); }); swData.WriteLine(sbHeader.ToString()); //Save test data title sbTitle.Append("Data Section,"); for (int i = 0; i < dataTable.Columns.Count - 2; i++) { sbTitle.Append(","); //补足”,“,否则import会报错 } sbTitle.AppendLine(); for (int i = 0; i < dataTable.Columns.Count; i++) { if (i != 0) sbTitle.Append(','); sbTitle.Append(dataTable.Columns[i].ColumnName); } swData.WriteLine(sbTitle.ToString()); //Build and save datatable foreach (DataRow drTemp in dataTable.Rows) { StringBuilder sbData = new StringBuilder(); for (int i = 0; i < dataTable.Columns.Count; i++) { if (i != 0) sbData.Append(','); sbData.Append(drTemp[i].ToString()); } swData.WriteLine(sbData.ToString()); } swData.Close(); } //end of Try #1 catch (Exception ex) { throw new Exception(ex.Message); } }
///<summary> ///<para>Parse test data from formatted csv file in to datatable</para> ///<seealso cref="DataParse.GetDataFromCsv"/> ///</summary> /// <param name="fileName">Full patch with file name of the csv file</param> /// <returns>DataTable</returns> public DataTable GetDataFromCsv(string fileName) { #region *** Variable define *** DateTime dtStart; TimeSpan ts; DataTable tblParseResult = new DataTable(); DataRow dr; StringBuilder sbDataString = new StringBuilder(); #endregion *** Variable define *** #region *** Initialize properties *** m_FreezeColumn = 5; m_ParseTime = 0; m_InsertTime = 0; m_TestedDevice = 0; m_PassedDevice = 0; m_FailedDevice = 0; m_Header = new DataHeader(); m_Bin = new Bin(); m_Bin.DeviceCount = new int[8]; m_Bin.Name = new string[8]; m_Bin.Number = new int[8]; m_Bin.Percent = new double[8]; #endregion *** Initialize properties *** #region *** Parsing csv file data into datatable *** // *** Timer session *** dtStart = DateTime.Now; try { using (CsvReader csv = new CsvReader(new StreamReader(fileName), false)) { #region *** Variable declare *** int rowsIndex = 0; int fieldcount = csv.FieldCount; //string[] columnName = csv.GetFieldHeaders(); bool isFreezeColumnSet = false; bool isStatusExist = false; bool isStatusAdded = false; bool isHeaderFinish = false; bool isColumnsGenerate = false; #endregion *** Variable declare *** #region *** Parse header information *** //Parse header csv.ReadNextRecord(); if (csv[0].Contains("Header Section")) { //csv.ReadNextRecord(); while (!isHeaderFinish ) { csv.ReadNextRecord(); string temp = csv[0]; if (csv[0].Contains("Data Section")) { isHeaderFinish = true; temp = csv[0]; } _FieldInfo FI = m_Header.GetType().GetField(csv[0]); if (FI != null) { Type type = FI.FieldType; FI.SetValueDirect(__makeref(m_Header), TypeDescriptor.GetConverter(type).ConvertFrom(csv[1])); //csv.ReadNextRecord(); } } } #endregion *** Parse header information *** #region *** Parsing data *** while (csv.ReadNextRecord()) { bool isDevicePass = true; dr = tblParseResult.NewRow(); #region *** Build datatable column *** //generate columns if (!isColumnsGenerate) { for (int i = 0; i < fieldcount; i++) { tblParseResult.Columns.Add(csv[i], typeof(string)); } csv.ReadNextRecord(); isColumnsGenerate = true; } #endregion *** Build datatable column *** #region *** Check freeze column *** if (!isFreezeColumnSet) { if (csv[2] == "Device ID") m_FreezeColumn = 3; else m_FreezeColumn = 5; isFreezeColumnSet = true; } #endregion *** Check freeze column *** #region *** Check if Status column exist *** if (!isStatusExist && !isStatusAdded) { if (csv[fieldcount - 1] != "Status") { tblParseResult.Columns.Add(fieldcount.ToString(), typeof(string)); dr[fieldcount] = "Status"; isStatusAdded = true; } else isStatusExist = true; } #endregion *** Check if Status column exist *** //*** Import data *** for (int i = 0; i < fieldcount; i++) { if (csv[i] == "") dr[i] = DBNull.Value; else { dr[i] = csv[i]; #region *** Update status *** if (!isStatusExist && rowsIndex > 3 && i > 2) { if (isDevicePass) { try { double dblResult = Convert.ToDouble(dr[i]); double LSL = Convert.ToDouble(tblParseResult.Rows[2][i]); double USL = Convert.ToDouble(tblParseResult.Rows[3][i]); if (dblResult < LSL //if data < LowLimit || dblResult > USL) //if data > HighLimit { dr[fieldcount] = "Fail"; isDevicePass = false; m_FailedDevice++; } else if (i == fieldcount - 1) { dr[fieldcount] = "Pass"; m_PassedDevice++; } } catch { dr[fieldcount] = "Fail"; } } } #endregion *** Update status *** } } tblParseResult.Rows.Add(dr); rowsIndex++; } #endregion *** parsing data *** } } catch (Exception ex) { throw new Exception(ex.Message); } //*** Timer session *** ts = DateTime.Now - dtStart; m_ParseTime = ts.TotalMilliseconds; m_TestedDevice = m_PassedDevice + m_FailedDevice; if (m_TestedDevice == 0) { m_TestedDevice = m_Header.TestQuantity; m_PassedDevice = m_Header.PassQuantity; m_FailedDevice = m_Header.FailQuantity; } #endregion *** Parsing csv file data into datatable *** tblParseResult.PrimaryKey = new DataColumn[] { tblParseResult.Columns[0] }; return tblParseResult; }//end of GetDataFromCsv
private void btnImport_Click(object sender, EventArgs e) { btnImport.BackColor = Color.Yellow; btnImport.Text = "Importing..."; btnImport.Enabled = false; #region *** Variables *** lblStatus.Text = "Importing Gold Data!"; this.Refresh(); string fileName = strGoldenPath + lbxProduct.SelectedItem.ToString(); DataTable tblKGUData = new DataTable(); DataHeader tHeader = new DataHeader(); tHeader = _DataParse.Header; string[] strCriteria = new string[6]; strCriteria[0] = tbxProduct.Text; strCriteria[1] = tbxRev.Text; strCriteria[2] = tbxDateTime.Text; strCriteria[3] = tbxLastDateTime.Text; strCriteria[4] = tbxComment.Text; strCriteria[5] = "ACE"; #endregion *** Variables *** #region *** Parsing data *** try { tblKGUData = _DataParse.GetDataFromCsv(fileName); } catch (Exception ex) { throw new Exception(ex.Message); } #endregion *** Parsing data *** //Insert golden data and return the golden data which device id is already in database #region *** Insert Database *** DataTable tblExist = mydb.InsertGoldenData(tblKGUData, strCriteria, false); lblStatus.Text = tblKGUData.Rows.Count - tblExist.Rows.Count + " Golden data has been imported Successfully!"; #endregion *** Insert Database *** //Update(Overwrite) these data #region *** Update database *** if (tblExist.Rows.Count > 4) { string DeviceID = ""; for (int i = 4; i < tblExist.Rows.Count; i++) { DeviceID += tblExist.Rows[i][2].ToString() + ", "; } if (MessageBox.Show("The following DeviceID is already in the database, do you want to update(Overwrite)?\r\n" + DeviceID, "Update", MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.Yes) { string strPW_o = "Vanchip@2013"; string strPW = ""; string strDesc = "Password is needed for procced"; while (true) { if (InputBox("Password", strDesc, ref strPW) == System.Windows.Forms.DialogResult.Cancel) { lblStatus.Text += " / " + (tblExist.Rows.Count - 4) + " golden data has been ignored!"; break; } if (strPW == strPW_o) { this.Refresh(); bool blnSuccess = mydb.InsertGoldenData(tblKGUData, strCriteria); lblStatus.Text = tblKGUData.Rows.Count - 4 + " Golden Data has been imported Successfully!"; break; } else { strDesc = "Wrong password, try again!"; } } } } #endregion *** Update database *** MessageBox.Show(lblStatus.Text); btnImport.BackColor = Color.Green; btnImport.Text = "Imported"; btnImport.Enabled = false; // Comment Out #region *** Save datatable to ascii file *** //SaveFileDialog saveFileDialog1 = new SaveFileDialog(); //saveFileDialog1.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); //if (tblKGUData.Rows.Count == 0) //{ // MessageBox.Show("No Test data need to be saved", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); // return; //} //saveFileDialog1.Title = "Save KGU file as"; //saveFileDialog1.FileName = lbxProduct.SelectedItem.ToString() + "_LTX"; //saveFileDialog1.Filter = "ASCII File|*.*"; //if (saveFileDialog1.ShowDialog() != DialogResult.OK) return; //StreamWriter swData = new StreamWriter(saveFileDialog1.FileName); //StringBuilder sbContent = new StringBuilder(); ////Header //swData.Write(sbHeader); //foreach (DataRow drTemp in tblKGUData.Rows) //{ // sbContent = new StringBuilder(); // int RowIndex = tblKGUData.Rows.IndexOf(drTemp); // if (RowIndex == 0) // { // sbContent.Append("Test_Num "); // for (int i = 3; i < tblKGUData.Columns.Count - 3; i++) // { // sbContent.Append(i - 2); // sbContent.Append(" "); // } // swData.WriteLine(sbContent.ToString()); // sbContent = new StringBuilder(); // drTemp[2] = "Test_Item"; // } // else if (RowIndex == 1) // { // drTemp[2] = "L_Tol"; // } // else if (RowIndex == 2) // { // drTemp[2] = "H_Tol"; // } // else if (RowIndex == 3) // { // drTemp[2] = "Enable"; // } // for (int i = 2; i < tblKGUData.Columns.Count - 3; i++) // { // string strTemp; // if (RowIndex == 0) // { // strTemp = drTemp[i].ToString().Replace(" ", "_"); // } // else if (RowIndex == 1 || RowIndex == 2) // { // if (drTemp[i].ToString() == "") // strTemp = "0"; // else // strTemp = drTemp[i].ToString(); // } // else // { // strTemp = drTemp[i].ToString(); // } // sbContent.Append(strTemp); // sbContent.Append(" "); // } // if (RowIndex == tblKGUData.Rows.Count - 1) // swData.Write(sbContent.ToString()); // else // swData.WriteLine(sbContent.ToString()); //} //swData.Close(); //MessageBox.Show("KGU file build successfully, new KGU file has been saved to " + saveFileDialog1.FileName, "Build KGU", MessageBoxButtons.OK); #endregion *** Save file *** }
///<summary> ///<para>Parse test data from LTX stdf test result in to datatable (multifile)</para> ///<seealso cref="DataParse.GetDataFromStd"/> ///</summary> /// <param name="fileName">Full patch with file name of the stdf file (multifile)</param> /// <returns>DataTable</returns> public async Task<DataTable> GetDataFromStdfviewerTask(string[] arrayFileName) { #region *** Variable define *** DataTable DataParseResult = new DataTable(); DataTable[] DataParseResultTemp = new DataTable[arrayFileName.Length]; double parseTime = 0; double insertTime = 0; int deviceCount = 0; int testedDevice = 0; int passedDevice = 0; int failedDevice = 0; DataHeader header = new Common.DataHeader(); Bin bin = new Common.Bin(); bool isFirstFile = true; bool isFirstTable = true; DateTime dtLotStart = DateTime.Now; DateTime dtLotFinish = DateTime.Now; Dictionary<string, int> headerDic = new Dictionary<string, int>(); #endregion *** Variable define *** #region *** Innitial Properties *** bin.DeviceCount = new int[8]; bin.Name = new string[8]; bin.Number = new int[8]; bin.Percent = new double[8]; header.SessionCount = 0; #endregion *** Innitial Properties *** try { #region *** Parsing Data *** int i = 0; foreach (string fileName in arrayFileName) { string ext = Path.GetExtension(fileName); using (FileStream fs = new FileStream(fileName, FileMode.Open)) { if (ext.ToLower() == ".std") { DataParseResultTemp[i] = await Task.Run(() => this.GetDataFromStdfviewer(fs)); } else if (ext.ToLower() == ".gz") { using (GZipStream gzs = new GZipStream(fs, CompressionMode.Decompress)) { DataParseResultTemp[i] = await Task.Run(() => this.GetDataFromStdfviewer(gzs)); } } else { throw new Exception("only for std/stdf or contain std/stdf gzip file! {Task<DataTable> GetDataFromStdfviewerTask(string[] arrayFileName)}"); } i++; } #region *** Caculate Properties *** header.SessionCount++; parseTime += m_ParseTime; insertTime += m_InsertTime; testedDevice += m_TestedDevice; passedDevice += m_PassedDevice; failedDevice += m_FailedDevice; header.FailQuantity += m_Header.FailQuantity; header.LotQuantity += m_Header.LotQuantity; header.PassQuantity += m_Header.PassQuantity; header.TestQuantity += m_Header.TestQuantity; header.enVision_Version = m_Header.enVision_Version; if (isFirstFile) { header.LotID = m_Header.LotID; header.SubLotID = m_Header.SubLotID; header.OperatorID = m_Header.OperatorID; header.TestBoard = m_Header.TestBoard; header.DeviceName = m_Header.DeviceName; header.Tester = m_Header.Tester; header.Handler = m_Header.Handler; header.TesterType = m_Header.TesterType; header.Product = m_Header.Product; header.ProgramRev = m_Header.ProgramRev; header.TestSession = m_Header.TestSession; dtLotStart = Convert.ToDateTime(m_Header.LotStartDateTime); dtLotFinish = Convert.ToDateTime(m_Header.LotFinishDateTime); isFirstFile = false; } else { if (m_Header.LotID != "" && m_Header.LotID != null) header.LotID = header.LotID + " & " + m_Header.LotID; if (m_Header.SubLotID != "" && m_Header.SubLotID != null) header.SubLotID = header.SubLotID + " & " + m_Header.SubLotID; if (m_Header.OperatorID != "" && m_Header.OperatorID != null) header.OperatorID = header.OperatorID + " & " + m_Header.OperatorID; if (m_Header.TestBoard != "" && m_Header.TestBoard != null) header.TestBoard = header.TestBoard + " & " + m_Header.TestBoard; if (m_Header.Tester != "" && m_Header.Tester != null) header.Tester = header.Tester + " & " + m_Header.Tester; if (m_Header.TesterType != "" && m_Header.TesterType != null) header.TesterType = header.TesterType + " & " + m_Header.TesterType; if (m_Header.Handler != "" && m_Header.Handler != null) header.Handler = header.Handler + " & " + m_Header.Handler; if (m_Header.TestSession != "" && m_Header.TestSession != null) header.TestSession = header.TestSession + " & " + m_Header.TestSession; //Lot Start Datetime if (m_Header.LotStartDateTime < dtLotStart) { dtLotStart = m_Header.LotStartDateTime; } //Lot Finish Datetime if (m_Header.LotFinishDateTime > dtLotFinish) { dtLotFinish = m_Header.LotFinishDateTime; } //Check Product Name if (m_Header.Product != header.Product) { throw new Exception("file " + fileName + " has different Product name with before."); } //Check Program Rev if (m_Header.ProgramRev != header.ProgramRev) { throw new Exception("file " + fileName + " has different Program Rev with before."); } }//end of if firstfile header.Yield = Math.Round(Convert.ToDouble(header.PassQuantity) / Convert.ToDouble(header.TestQuantity) * 100, 3); header.LotStartDateTime = dtLotStart; header.LotFinishDateTime = dtLotFinish; for (int j = 0; j < 8; j++) { bin.DeviceCount[j] += m_Bin.DeviceCount[j]; bin.Name[j] = m_Bin.Name[j]; bin.Number[j] = m_Bin.Number[j]; bin.Percent[j] = Math.Round(Convert.ToDouble(bin.DeviceCount[j]) / Convert.ToDouble(m_TestedDevice) * 100, 3); } #endregion *** Caculate Properties *** } //end of foreach (string fileName in arrayFileName) #endregion *** Parsing Data *** #region *** Merge Data Table *** foreach (DataTable tblDataTemp in DataParseResultTemp) if (isFirstTable) { isFirstTable = false; //Build table structure DataParseResult = tblDataTemp.Clone(); foreach (DataRow dr in tblDataTemp.Rows) { DataParseResult.ImportRow(dr); } //get first table device count deviceCount = DataParseResult.Rows.Count - 4; } else { //merge less columns datatable to more columns datatable if (tblDataTemp.Columns.Count > DataParseResult.Columns.Count) { foreach (DataRow dr in DataParseResult.Rows) { if (DataParseResult.Rows.IndexOf(dr) > 3) { //reset device count deviceCount++; dr[0] = deviceCount; tblDataTemp.ImportRow(dr); //Move Status Column to last int lastRowIndex = tblDataTemp.Rows.Count - 1; int lastColumnIndex = tblDataTemp.Columns.Count - 1; tblDataTemp.Rows[lastRowIndex][lastColumnIndex] = dr[DataParseResult.Columns.Count - 1]; tblDataTemp.Rows[lastRowIndex][DataParseResult.Columns.Count - 1] = null; } } DataParseResult = tblDataTemp; } else { try { tblDataTemp.PrimaryKey = null; foreach (DataRow dr in tblDataTemp.Rows) { if (tblDataTemp.Rows.IndexOf(dr) > 3) { //reset device count deviceCount++; dr[0] = deviceCount; DataParseResult.ImportRow(dr); //Move Status Column to last if (tblDataTemp.Columns.Count < DataParseResult.Columns.Count) { int lastRowIndex = DataParseResult.Rows.Count - 1; int lastColumnIndex = DataParseResult.Columns.Count - 1; DataParseResult.Rows[lastRowIndex][lastColumnIndex] = dr[tblDataTemp.Columns.Count - 1]; DataParseResult.Rows[lastRowIndex][tblDataTemp.Columns.Count - 1] = null; } } }//end of foreach (DataRow dr in DataParseResultTemp.Rows) } catch (Exception ex) { throw new Exception(ex.Message); } }//end of if (DataParseResultTemp.Columns.Count > DataParseResult.Columns.Count) }// end of if else (isFirstTable) #endregion *** Merge Data Table *** #region *** Final Properties *** m_Bin = bin; m_Header = header; m_FailedDevice = failedDevice; m_PassedDevice = passedDevice; m_TestedDevice = testedDevice; m_ParseTime = parseTime; m_InsertTime = insertTime; #endregion *** Final Properties *** } catch (Exception ex) { throw new Exception("Parse data error \n "+ ex.Message); } DataParseResult.PrimaryKey = new DataColumn[] { DataParseResult.Columns[0] }; return DataParseResult; }
///<summary> ///<para>Parse test data from csv file(Acetech format) in to datatable</para> ///<seealso cref="DataParse.GetDataFromCsv"/> ///</summary> /// <param name="fileName">Full patch with file name of the csv file</param> /// <returns>DataTable</returns> public DataTable[] GetDataFromAceTechCsv(string fileName) { #region *** Variable define *** DateTime dtStart; TimeSpan ts; DataRow dr; DataTable[] tblParseResult = new DataTable[6]; for (int i = 0; i < 6; i++) { tblParseResult[i] = new DataTable(); } // 0 -- KGU // 1 -- FT // 2 -- RT1 // 3 -- RT2 // 4 -- EQC // 5 -- EQCV #endregion *** Variable define *** #region *** Initialize properties *** m_FreezeColumn = 5; m_ParseTime = 0; m_InsertTime = 0; m_TestedDevice = 0; m_PassedDevice = 0; m_FailedDevice = 0; m_Bin = new Bin(); m_Bin.DeviceCount = new int[8]; m_Bin.Name = new string[8]; m_Bin.Number = new int[8]; m_Bin.Percent = new double[8]; m_Header = new DataHeader(); a_Header = new AceTechDataHeader(); a_Header.KGU = false; a_Header.FT = false; a_Header.RT1 = false; a_Header.RT2 = false; a_Header.EQC = false; a_Header.EQCV = false; #endregion *** Initialize properties *** #region *** Parsing csv file data into datatable *** // *** Timer session *** dtStart = DateTime.Now; try { using (CsvReader csv = new CsvReader(new StreamReader(fileName), false)) { #region *** Variable declare *** int rowsIndex = 0; int fieldcount = csv.FieldCount - 4 - 1; //string[] columnName = csv.GetFieldHeaders(); bool isFreezeColumnSet = false; bool isStatusExist = false; bool isStatusAdded = false; bool isHeaderFinish = false; bool isColumnsGenerate = false; #endregion *** Variable declare *** #region *** Parse header information *** //Parse header csv.ReadNextRecord(); if (csv[0].Contains("Header Section")) { //csv.ReadNextRecord(); while (!isHeaderFinish) { csv.ReadNextRecord(); string temp = csv[0]; if (csv[0].Contains("Data Section")) { isHeaderFinish = true; temp = csv[0]; } _FieldInfo FI = a_Header.GetType().GetField(csv[0]); if (FI != null) { try { Type type = FI.FieldType; FI.SetValueDirect(__makeref(a_Header), TypeDescriptor.GetConverter(type).ConvertFrom(csv[1])); //csv.ReadNextRecord(); } catch (Exception ex) { Type type = FI.FieldType; if (type.Name == "Double") { FI.SetValueDirect(__makeref(a_Header), 0.0); } else if (type.Name == "DateTime") { string strTemp = csv[1]; string[] chrTemp = strTemp.Split('-'); strTemp = chrTemp[0] + "/" + chrTemp[1] + "/" + chrTemp[2] + " " + chrTemp[3] + ":" + chrTemp[4] + ":" + chrTemp[5]; FI.SetValueDirect(__makeref(a_Header), TypeDescriptor.GetConverter(type).ConvertFrom(strTemp)); } //csv.ReadNextRecord(); } } } } #endregion *** Parse header information *** #region *** Parsing data *** while (csv.ReadNextRecord()) { #region *** Build datatable column *** //generate columns if (!isColumnsGenerate) { for (int i = 0; i < fieldcount; i++) { for (int j = 0; j < 6; j++) { if (i == 0) tblParseResult[j].Columns.Add("Device#", typeof(string)); else tblParseResult[j].Columns.Add(i.ToString(), typeof(string)); } } csv.ReadNextRecord(); isColumnsGenerate = true; } #endregion *** Build datatable column *** #region *** Check freeze column *** if (!isFreezeColumnSet) { //if (csv[2] == "Device ID") m_FreezeColumn = 3; //else // m_FreezeColumn = 5; isFreezeColumnSet = true; } #endregion *** Check freeze column *** //*** Build Limit *** try { #region --- Build Limit --- if (csv[5].ToString() == "Unit") { // Units try { dr = tblParseResult[0].NewRow(); for (int i = 0; i < fieldcount; i++) { if (i == 0) { dr[0] = csv[5]; dr[1] = ""; dr[2] = ""; } else if (i >= 3) { dr[i] = csv[i + 3]; } } } catch (Exception ex) { throw new Exception(ex.Message); } tblParseResult[0].Rows.Add(dr); csv.ReadNextRecord(); // UL dr = tblParseResult[0].NewRow(); for (int i = 0; i < fieldcount; i++) { if (i == 0) { dr[0] = csv[5]; dr[1] = ""; dr[2] = ""; } else if (i >= 3) { dr[i] = csv[i + 3]; } } tblParseResult[0].Rows.Add(dr); csv.ReadNextRecord(); // LL dr = tblParseResult[0].NewRow(); for (int i = 0; i < fieldcount; i++) { if (i == 0) { dr[0] = csv[5]; dr[1] = ""; dr[2] = ""; } else if (i >= 3) { dr[i] = csv[i + 3]; } } tblParseResult[0].Rows.InsertAt(dr, 1); csv.ReadNextRecord(); // Parameter dr = tblParseResult[0].NewRow(); for (int i = 0; i < fieldcount; i++) { if (i == 0) { dr[0] = "TestItem"; dr[1] = "SiteNo"; dr[2] = "Device ID"; } else if (i >= 3) { dr[i] = csv[i + 3]; } } dr[fieldcount - 1] = "Status"; tblParseResult[0].Rows.InsertAt(dr, 0); csv.ReadNextRecord(); for (int i = 1; i < 6; i++) { for (int j = 0; j <= 3; j++) { tblParseResult[i].ImportRow(tblParseResult[0].Rows[j]); } } } #endregion --- Build Limit --- } catch (Exception ex) { throw new Exception(ex.Message); } //*** Import data *** #region --- KGU Data --- if (csv[1].ToString() == "GUV") { dr = tblParseResult[0].NewRow(); for (int i = 0; i < fieldcount; i++) { if (i == 0) { dr[0] = csv[0]; dr[1] = csv[4]; dr[2] = csv[2]; } else if (i >= 3) { if (csv[i] == "") dr[i] = DBNull.Value; else { dr[i] = csv[i + 3]; } } } //KGU Number if (!a_Header.KGU) a_Header.KGU_Number = csv[2].ToString(); else a_Header.KGU_Number = a_Header.KGU_Number + "," + csv[2].ToString(); tblParseResult[0].Rows.Add(dr); a_Header.KGU = true; } #endregion --- KGU Data --- #region --- FT Data --- else if (csv[1].ToString() == "FT" && csv[3].ToString() == "NEQC") { dr = tblParseResult[1].NewRow(); for (int i = 0; i < fieldcount ; i++) { if (i == 0) { dr[0] = csv[0]; dr[1] = csv[4]; dr[2] = csv[2]; } else if (i >= 3) { if (csv[i] == "") dr[i] = DBNull.Value; else { dr[i] = csv[i + 3]; } } } tblParseResult[1].Rows.Add(dr); a_Header.FT = true; } #endregion --- FT Data --- #region --- RT1 Data --- else if (csv[1].ToString() == "RT1") { dr = tblParseResult[2].NewRow(); for (int i = 0; i < fieldcount; i++) { if (i == 0) { dr[0] = csv[0]; dr[1] = csv[4]; dr[2] = csv[2]; } else if (i >= 3) { if (csv[i] == "") dr[i] = DBNull.Value; else { dr[i] = csv[i + 3]; } } } tblParseResult[2].Rows.Add(dr); a_Header.RT1 = true; } #endregion --- RT1 Data --- #region --- RT2 Data --- else if (csv[1].ToString() == "RT2") { dr = tblParseResult[3].NewRow(); for (int i = 0; i < fieldcount; i++) { if (i == 0) { dr[0] = csv[0]; dr[1] = csv[4]; dr[2] = csv[2]; } else if (i >= 3) { if (csv[i] == "") dr[i] = DBNull.Value; else { dr[i] = csv[i + 3]; } } } tblParseResult[3].Rows.Add(dr); a_Header.RT2 = true; } #endregion --- RT2 Data --- #region --- FT EQC Data --- else if (csv[1].ToString() == "FT" && csv[3].ToString() == "EQC") { dr = tblParseResult[4].NewRow(); for (int i = 0; i < fieldcount; i++) { if (i == 0) { dr[0] = csv[0]; dr[1] = csv[4]; dr[2] = csv[2]; } else if (i >= 3) { if (csv[i] == "") dr[i] = DBNull.Value; else { dr[i] = csv[i + 3]; } } } tblParseResult[4].Rows.Add(dr); a_Header.EQC = true; } #endregion --- FT EQC Data --- #region --- EQCV Data --- else if (csv[1].ToString() == "EQCV") { dr = tblParseResult[5].NewRow(); for (int i = 0; i < fieldcount; i++) { if (i == 0) { dr[0] = csv[0]; dr[1] = csv[4]; dr[2] = csv[2]; } else if (i >= 3) { if (csv[i] == "") dr[i] = DBNull.Value; else { dr[i] = csv[i + 3]; } } } tblParseResult[5].Rows.Add(dr); a_Header.EQCV = true; } #endregion --- EQCV Data --- } #endregion *** parsing data *** } } catch (Exception ex) { throw new Exception(ex.Message); } //*** Timer session *** ts = DateTime.Now - dtStart; m_ParseTime = ts.TotalMilliseconds; #endregion *** Parsing csv file data into datatable *** for (int i = 1; i < 6; i++) { tblParseResult[1].PrimaryKey = new DataColumn[] { tblParseResult[1].Columns[0] }; } return tblParseResult; }//end of GetDataFromCsv
///<summary> ///<para>Parse test data from LTX std test result in to datatable(use stdf viewer tool)</para> ///<seealso cref="DataParse.GetDataFromTxt"/> ///</summary> /// <param name="fileStream">Full patch with file name of the std/stdf file(compressed.gz)</param> /// <returns>DataTable</returns> public DataTable GetDataFromStdfviewer(Stream fileStream) { #region *** Variable define *** DateTime dtStart; TimeSpan ts; DataTable temp_header = new DataTable(); DataTable DataParseResult = new DataTable(); #endregion *** Variable define *** #region *** Initialize properties *** m_FreezeColumn = 5; m_ParseTime = 0; m_InsertTime = 0; m_TestedDevice = 0; m_PassedDevice = 0; m_FailedDevice = 0; m_Header = new DataHeader(); m_Bin = new Bin(); m_Bin.DeviceCount = new int[8]; m_Bin.Name = new string[8]; m_Bin.Number = new int[8]; m_Bin.Percent = new double[8]; m_Header.SessionCount = 0; #endregion *** Initialize properties *** //Timer session dtStart = DateTime.Now; #region // Analysis stdf file STDF_Viewer.Record stdf_viewer = new STDF_Viewer.Record(); using (fileStream) { stdf_viewer.AnalyzeFile(fileStream); } ts = DateTime.Now - dtStart; temp_header = stdf_viewer.GetHeaderStr(); DataParseResult = stdf_viewer.GetData(); #endregion #region // header info Dictionary<string, string> dic_header = new Dictionary<string, string>(); foreach (DataRow dc_header in temp_header.Rows) { dic_header.Add(dc_header[0].ToString().Trim(), dc_header[1].ToString().Trim()); } string temp = dic_header["MIR.JOB_NAM"]; this.GetProgramNameRev(temp); m_Header.SessionCount++; m_Header.enVision_Version = dic_header["MIR.EXEC_VER"]; m_Header.LotID = dic_header["MIR.LOT_ID"]; m_Header.Tester = dic_header["MIR.NODE_NAM"]; m_Header.DeviceName = dic_header["MIR.PART_TYP"]; m_Header.SubLotID = dic_header["MIR.SBLOT_ID"]; m_Header.TesterType = dic_header["MIR.TSTR_TYP"]; m_Header.TestSession = dic_header["MIR.TEST_COD"]; try { m_Header.LotStartDateTime = DateTime.Parse(dic_header["MIR.START_T"]); } catch { m_Header.LotStartDateTime = DateTime.Parse("1900-1-1 0:00"); } try { m_Header.LotFinishDateTime = DateTime.Parse(dic_header["MRR.FINISH_T"]); } catch { m_Header.LotFinishDateTime = DateTime.Parse("1900-1-1 0:00"); } m_Header.LotDesc = dic_header["MRR.USR_DESC"]; m_TestedDevice = m_Header.TestQuantity = Convert.ToInt32(dic_header["PCR.PART_CNT"]); if (m_TestedDevice == 0) m_TestedDevice = m_Header.TestQuantity = DataParseResult.Rows.Count - 4; m_PassedDevice = m_Header.PassQuantity = Convert.ToInt32(dic_header["PCR.GOOD_CNT"]); if (m_PassedDevice == 0) { DataRow[] drs = DataParseResult.Select("[" + (DataParseResult.Columns.Count - 1) + "] Like 'Pass'"); m_PassedDevice = m_Header.PassQuantity = drs.Count(); } m_FailedDevice = m_Header.FailQuantity = m_Header.TestQuantity - m_Header.PassQuantity; //Yield double yield = Convert.ToDouble(m_Header.PassQuantity) / Convert.ToDouble(m_Header.TestQuantity) * 100; m_Header.Yield = Math.Round(yield, 2); #endregion //Timer session ts = DateTime.Now - dtStart; ParseTime = ts.TotalMilliseconds; dtStart = DateTime.Now; DataParseResult.PrimaryKey = new DataColumn[] { DataParseResult.Columns[0] }; return DataParseResult; //throw new Exception("ooops"); }
///<summary> ///<para>Parse test data from LTX std test result in to datatable(use stdf viewer tool)</para> ///<seealso cref="DataParse.GetDataFromTxt"/> ///</summary> /// <param name="fileName">Full patch with file name of the std/stdf file</param> /// <returns>DataTable</returns> public DataTable GetDataFromStdfviewer(string fileName) { #region *** Variable define *** DateTime dtStart; TimeSpan ts; DataRow dr; DataTable temp_header = new DataTable(); DataTable temp_data = new DataTable(); DataTable DataParseResult = new DataTable(); StringBuilder sbData1 = new StringBuilder(); StringBuilder sbData2 = new StringBuilder(); StringBuilder sbColumnName = new StringBuilder("Device#,1,2,3,4"); StringBuilder sbParameter = new StringBuilder("Test Item,Site No,Soft Bin,Hard Bin,Device ID"); StringBuilder sbLowLimit = new StringBuilder("Low Limit,,,,"); StringBuilder sbHighLimit = new StringBuilder("High Limit,,,,"); StringBuilder sbUnits = new StringBuilder("Units,,,,"); bool isLimitSet = false; int ParameterLength = 0; int intColumnLength = 0; int intDeviceCounter = 1; int i; string PassFail1, PassFail2; #endregion *** Variable define *** #region *** Initialize properties *** m_FreezeColumn = 5; m_ParseTime = 0; m_InsertTime = 0; m_TestedDevice = 0; m_PassedDevice = 0; m_FailedDevice = 0; m_Header = new DataHeader(); m_Bin = new Bin(); m_Bin.DeviceCount = new int[8]; m_Bin.Name = new string[8]; m_Bin.Number = new int[8]; m_Bin.Percent = new double[8]; m_Header.SessionCount = 0; #endregion *** Initialize properties *** //Timer session dtStart = DateTime.Now; #region // Analysis stdf file STDF_Viewer.Record stdf_viewer = new STDF_Viewer.Record(); stdf_viewer.AnalyzeFile(fileName); temp_header = stdf_viewer.GetHeaderStr(); temp_data = stdf_viewer.GetData(); #endregion ts = DateTime.Now - dtStart; #region // Build datatable int col_index = 0; foreach (DataColumn temp_dc in temp_data.Columns) { if (col_index == 0) DataParseResult.Columns.Add("Device#", typeof(string)); else { DataParseResult.Columns.Add(col_index.ToString(), typeof(string)); if (col_index >= 5) sbParameter.Append("," + temp_dc.ColumnName.ToString()); } col_index++; } #endregion #region // insert test decription col_index =0; DataRow dr_Parameter = DataParseResult.NewRow(); string[] temp_array_Parameter = sbParameter.ToString().Split(','); foreach (string temp_Parameter in temp_array_Parameter) { dr_Parameter[col_index] = temp_Parameter; col_index++; } DataParseResult.Rows.Add(dr_Parameter); #endregion #region // Insert unit and limit int row_index =0; col_index = 0; Dictionary<int, double> dic_multiplier = new Dictionary<int, double>(); foreach (DataRow temp_dr in temp_data.Rows) { //initialize the unit nultiplier if (row_index == 0) { temp_dr[0] = "Unit"; for (col_index = 5; col_index < temp_dr.ItemArray.Length; col_index++) { if (temp_data.Columns[col_index].ToString().ToLower().Contains("status")) { dic_multiplier.Add(col_index, 5272); // 5272 is keyValue for pass/fail columns continue; } #region new rule if (temp_dr[col_index].ToString().ToUpper() == "A" && temp_data.Columns[col_index].ToString().ToLower().Contains("_ua")) { temp_dr[col_index] = "uA"; dic_multiplier.Add(col_index, 1000 * 1000); continue; } else if (temp_dr[col_index].ToString().ToUpper() == "A") /// && temp_data.Columns[col_index].ToString().ToLower().Contains("_ma")) { if (temp_data.Columns[col_index].ToString().ToLower().Contains("leakage")) { temp_dr[col_index] = "uA"; dic_multiplier.Add(col_index, 1000 * 1000); } else { temp_dr[col_index] = "mA"; dic_multiplier.Add(col_index, 1000); } continue; } else if (temp_dr[col_index].ToString().ToUpper() == "S" && temp_data.Columns[col_index].ToString().ToLower().Contains("_us")) { temp_dr[col_index] = "us"; dic_multiplier.Add(col_index, 1000 * 1000); continue; } else if (temp_dr[col_index].ToString().ToUpper() == "S" && temp_data.Columns[col_index].ToString().ToLower().Contains("_ms")) { temp_dr[col_index] = "ms"; dic_multiplier.Add(col_index, 1000); continue; } else if (temp_dr[col_index].ToString().ToUpper() == "S") ///&& temp_data.Columns[col_index].ToString().ToLower().Contains("_ms")) { temp_dr[col_index] = "ms"; dic_multiplier.Add(col_index, 1000); continue; } #endregion #region old rule_1 //if (temp_dr[col_index].ToString().ToUpper() == "A") //{ // if (temp_data.Columns[col_index].ToString().ToLower().Contains("leakage")) // { // temp_dr[col_index] = "uA"; // dic_multiplier.Add(col_index, 1000 * 1000); // } // else // { // temp_dr[col_index] = "mA"; // dic_multiplier.Add(col_index, 1000); // } //} //else if (temp_dr[col_index].ToString().ToUpper() == "S") //{ // temp_dr[col_index] = "ms"; // dic_multiplier.Add(col_index, 1000); //} #endregion } } else { if (row_index == 1) temp_dr[0] = "Low Limit"; else if (row_index == 2) temp_dr[0] = "High Limit"; // apply unit multiplier foreach (var item in dic_multiplier) { if (item.Value != 5272) temp_dr[item.Key] = Convert.ToDouble(temp_dr[item.Key]) * item.Value; } } DataParseResult.Rows.Add (temp_dr.ItemArray); row_index++; if (row_index > 2) break; } #endregion #region // insert data // remove limit and unit which none float rows temp_data.Rows.RemoveAt(0); temp_data.Rows.RemoveAt(0); temp_data.Rows.RemoveAt(0); // unit convertion (A -> mA / uA, S -> ms ) // generate extra columns by using multiplier then copy to new datatable DataTable temp_data_mid = new DataTable(); temp_data_mid = temp_data.Clone(); for (col_index = 0; col_index < temp_data.Columns.Count; col_index++) { if (col_index < 5) temp_data_mid.Columns[col_index].DataType = typeof(int); else if (col_index == temp_data.Columns.Count - 1) temp_data_mid.Columns[col_index].DataType = typeof(int); else temp_data_mid.Columns[col_index].DataType = typeof(float); } foreach (DataRow dr_mid in temp_data.Rows) { temp_data_mid.Rows.Add(dr_mid.ItemArray); } for (col_index = 0; col_index < temp_data.Columns.Count; col_index++) { DataColumn dc_temp_mid = new DataColumn(col_index.ToString(), typeof(string)); temp_data_mid.Columns.Add(dc_temp_mid); // set exrpession if (dic_multiplier.ContainsKey(col_index)) { if (dic_multiplier[col_index] == 5272) dc_temp_mid.Expression = "IIF(" + temp_data_mid.Columns[col_index].ColumnName + "=0, 'Pass', 'Fail')"; else { dc_temp_mid.Expression = "[" + temp_data_mid.Columns[col_index].ColumnName + "] * " + dic_multiplier[col_index]; //dc_temp_mid.Expression = "Convert([" + temp_data_mid.Columns[col_index].ColumnName + "] * " + dic_multiplier[col_index] + " * 1000, 'System.Int32')/1000"; } } else { dc_temp_mid.Expression = "[" + temp_data_mid.Columns[col_index].ColumnName + "] * 1"; //dc_temp_mid.Expression = "Convert([" + temp_data_mid.Columns[col_index].ColumnName + "] * 1000, 'System.Int32')/1000"; } } int start = DataParseResult.Columns.Count; int length = start; foreach (DataRow dr_temp in temp_data_mid.Rows) { object[] arr_temp = new object[length]; Array.ConstrainedCopy(dr_temp.ItemArray, start, arr_temp, 0, length); DataParseResult.Rows.Add(arr_temp); } // set primary key DataParseResult.PrimaryKey = new DataColumn[] { DataParseResult.Columns[0] }; #endregion #region // header info Dictionary<string, string> dic_header = new Dictionary<string, string>(); foreach (DataRow dc_header in temp_header.Rows) { dic_header.Add(dc_header[0].ToString().Trim(), dc_header[1].ToString().Trim()); } string temp = dic_header["MIR.JOB_NAM"]; this.GetProgramNameRev(temp); m_Header.SessionCount++; m_Header.enVision_Version = dic_header["MIR.EXEC_VER"]; m_Header.LotID = dic_header["MIR.LOT_ID"]; m_Header.Tester = dic_header["MIR.NODE_NAM"]; m_Header.DeviceName = dic_header["MIR.PART_TYP"]; m_Header.SubLotID = dic_header["MIR.SBLOT_ID"]; m_Header.TesterType = dic_header["MIR.TSTR_TYP"]; m_Header.TestSession = dic_header["MIR.TEST_COD"]; try { m_Header.LotStartDateTime = DateTime.Parse(dic_header["MIR.START_T"]); } catch { m_Header.LotStartDateTime = DateTime.Parse("1900-1-1 0:00"); } try { m_Header.LotFinishDateTime = DateTime.Parse(dic_header["MRR.FINISH_T"]); } catch { m_Header.LotFinishDateTime = DateTime.Parse("1900-1-1 0:00"); } m_Header.LotDesc = dic_header["MRR.USR_DESC"]; m_TestedDevice = m_Header.TestQuantity = Convert.ToInt32(dic_header["PCR.PART_CNT"]); if (m_TestedDevice == 0) m_TestedDevice = m_Header.TestQuantity = DataParseResult.Rows.Count - 4; m_PassedDevice = m_Header.PassQuantity = Convert.ToInt32(dic_header["PCR.GOOD_CNT"]); if (m_PassedDevice == 0) { DataRow[] drs = DataParseResult.Select("[" + (DataParseResult.Columns.Count - 1) + "] Like 'Pass'"); m_PassedDevice = m_Header.PassQuantity = drs.Count(); } m_FailedDevice = m_Header.FailQuantity = m_Header.TestQuantity - m_Header.PassQuantity; //Yield double yield = Convert.ToDouble(m_Header.PassQuantity) / Convert.ToDouble(m_Header.TestQuantity) * 100; m_Header.Yield = Math.Round(yield, 2); #endregion //Timer session ts = DateTime.Now - dtStart; ParseTime = ts.TotalMilliseconds; dtStart = DateTime.Now; DataParseResult.PrimaryKey = new DataColumn[] { DataParseResult.Columns[0] }; return DataParseResult; //throw new Exception("ooops"); }
///<summary> ///<para>Parse test data from LTX stdf test result in to datatable (multifile)</para> ///<seealso cref="DataParse.GetDataFromStd"/> ///</summary> /// <param name="fileName">Full patch with file name of the stdf file (multifile)</param> /// <returns>DataTable</returns> public DataTable GetDataFromStd(string[] arrayFileName) { #region *** Variable define *** DataTable DataParseResult = new DataTable(); DataTable DataParseResultTemp = new DataTable(); double parseTime = 0; double insertTime = 0; int deviceCount = 0; int testedDevice = 0; int passedDevice = 0; int failedDevice = 0; DataHeader header = new Common.DataHeader(); Bin bin = new Common.Bin(); bool isFirstFile = true; bool isFirstTable = true; DateTime dtLotStart = DateTime.Now; DateTime dtLotFinish = DateTime.Now; Dictionary<string, int> headerDic = new Dictionary<string, int>(); #endregion *** Variable define *** #region *** Innitial Properties *** bin.DeviceCount = new int[8]; bin.Name = new string[8]; bin.Number = new int[8]; bin.Percent = new double[8]; header.SessionCount = 0; #endregion *** Innitial Properties *** #region *** Get and merge data table *** try { foreach (string fileName in arrayFileName) //Parallel.ForEach(arrayFileName, fileName => { DataParseResultTemp = this.GetDataFromStd(fileName); #region *** Caculate Properties *** header.SessionCount++; parseTime += m_ParseTime; insertTime += m_InsertTime; testedDevice += m_TestedDevice; passedDevice += m_PassedDevice; failedDevice += m_FailedDevice; header.FailQuantity += m_Header.FailQuantity; header.LotQuantity += m_Header.LotQuantity; header.PassQuantity += m_Header.PassQuantity; header.TestQuantity += m_Header.TestQuantity; header.enVision_Version = m_Header.enVision_Version; if (isFirstFile) { header.LotID = m_Header.LotID; header.SubLotID = m_Header.SubLotID; header.OperatorID = m_Header.OperatorID; header.TestBoard = m_Header.TestBoard; header.DeviceName = m_Header.DeviceName; header.Tester = m_Header.Tester; header.Handler = m_Header.Handler; header.TesterType = m_Header.TesterType; header.Product = m_Header.Product; header.ProgramRev = m_Header.ProgramRev; dtLotStart = Convert.ToDateTime(m_Header.LotStartDateTime); dtLotFinish = Convert.ToDateTime(m_Header.LotFinishDateTime); isFirstFile = false; } else { if (m_Header.LotID != "" && m_Header.LotID != null) header.LotID = header.LotID + " & " + m_Header.LotID; if (m_Header.SubLotID != "" && m_Header.SubLotID != null) header.SubLotID = header.SubLotID + " & " + m_Header.SubLotID; if (m_Header.OperatorID != "" && m_Header.OperatorID != null) header.OperatorID = header.OperatorID + " & " + m_Header.OperatorID; if (m_Header.TestBoard != "" && m_Header.TestBoard != null) header.TestBoard = header.TestBoard + " & " + m_Header.TestBoard; if (m_Header.Tester != "" && m_Header.Tester != null) header.Tester = header.Tester + " & " + m_Header.Tester; if (m_Header.TesterType != "" && m_Header.TesterType != null) header.TesterType = header.TesterType + " & " + m_Header.TesterType; if (m_Header.Handler != "" && m_Header.Handler != null) header.Handler = header.Handler + " & " + m_Header.Handler; //Lot Start Datetime if (m_Header.LotStartDateTime < dtLotStart) { dtLotStart = m_Header.LotStartDateTime; } //Lot Finish Datetime if (m_Header.LotFinishDateTime > dtLotFinish) { dtLotFinish = m_Header.LotFinishDateTime; } //Check Product Name if (m_Header.Product != header.Product) { throw new Exception("file " + fileName + " has different Product name with before."); } //Check Program Rev if (m_Header.ProgramRev != header.ProgramRev) { throw new Exception("file " + fileName + " has different Program Rev with before."); } }//end of if firstfile header.Yield = Math.Round(Convert.ToDouble(header.PassQuantity) / Convert.ToDouble(header.TestQuantity) * 100, 3); header.LotStartDateTime = dtLotStart; header.LotFinishDateTime = dtLotFinish; for (int i = 0; i < 8; i++) { bin.DeviceCount[i] += m_Bin.DeviceCount[i]; bin.Name[i] = m_Bin.Name[i]; bin.Number[i] = m_Bin.Number[i]; bin.Percent[i] = Math.Round(Convert.ToDouble(bin.DeviceCount[i]) / Convert.ToDouble(m_TestedDevice) * 100, 3); } #endregion *** Caculate Properties *** #region *** Merge Data Table *** if (isFirstTable) { isFirstTable = false; //Build table structure DataParseResult = DataParseResultTemp.Clone(); foreach (DataRow dr in DataParseResultTemp.Rows) { DataParseResult.ImportRow(dr); } //get first table device count deviceCount = DataParseResult.Rows.Count - 4; } else { //merge less columns datatable to more columns datatable if (DataParseResultTemp.Columns.Count > DataParseResult.Columns.Count) { foreach (DataRow dr in DataParseResult.Rows) { if (DataParseResult.Rows.IndexOf(dr) > 3) { //reset device count deviceCount++; dr[0] = deviceCount; DataParseResultTemp.ImportRow(dr); //Move Status Column to last int lastRowIndex = DataParseResultTemp.Rows.Count - 1; int lastColumnIndex = DataParseResultTemp.Columns.Count - 1; DataParseResultTemp.Rows[lastRowIndex][lastColumnIndex] = dr[DataParseResult.Columns.Count - 1]; DataParseResultTemp.Rows[lastRowIndex][DataParseResult.Columns.Count - 1] = null; } } DataParseResult = DataParseResultTemp; } else { foreach (DataRow dr in DataParseResultTemp.Rows) { if (DataParseResultTemp.Rows.IndexOf(dr) > 3) { //reset device count deviceCount++; dr[0] = deviceCount; DataParseResult.ImportRow(dr); //Move Status Column to last if (DataParseResultTemp.Columns.Count < DataParseResult.Columns.Count) { int lastRowIndex = DataParseResult.Rows.Count - 1; int lastColumnIndex = DataParseResult.Columns.Count - 1; DataParseResult.Rows[lastRowIndex][lastColumnIndex] = dr[DataParseResultTemp.Columns.Count - 1]; DataParseResult.Rows[lastRowIndex][DataParseResultTemp.Columns.Count - 1] = null; } } }//end of foreach (DataRow dr in DataParseResultTemp.Rows) }//end of if (DataParseResultTemp.Columns.Count > DataParseResult.Columns.Count) }// end of if else (isFirstTable) #endregion *** Merge Data Table *** }//);//end of foreach (string fileName in arrayFileName) #region *** Final Properties *** m_Bin = bin; m_Header = header; m_FailedDevice = failedDevice; m_PassedDevice = passedDevice; m_TestedDevice = testedDevice; m_ParseTime = parseTime; m_InsertTime = insertTime; #endregion *** Final Properties *** } catch (Exception ex) { throw new Exception("Parse data error \n " + ex.Message); } #endregion *** Parse test data from txt file *** DataParseResult.PrimaryKey = new DataColumn[] { DataParseResult.Columns[0] }; return DataParseResult; }
}//end of GetDataFromTxt MultiFile ///<summary> ///<para>Parse test data from LTX std test result in to datatable</para> ///<seealso cref="DataParse.GetDataFromTxt"/> ///</summary> /// <param name="fileName">Full patch with file name of the std file</param> /// <returns>DataTable</returns> public DataTable GetDataFromStd(string fileName) { #region *** Variable define *** DateTime dtStart; TimeSpan ts; DataRow dr; DataTable DataParseResult = new DataTable(); StringBuilder sbData1 = new StringBuilder(); StringBuilder sbData2 = new StringBuilder(); StringBuilder sbColumnName = new StringBuilder("Device#,1,2,3,4"); StringBuilder sbParameter = new StringBuilder("Test Item,Site No,Soft Bin,Hard Bin,Device ID"); StringBuilder sbLowLimit = new StringBuilder("Low Limit,,,,"); StringBuilder sbHighLimit = new StringBuilder("High Limit,,,,"); StringBuilder sbUnits = new StringBuilder("Units,,,,"); bool isLimitSet = false; int ParameterLength = 0; int intColumnLength = 0; int intDeviceCounter = 1; int i; string PassFail1, PassFail2; #endregion *** Variable define *** #region *** Initialize properties *** m_FreezeColumn = 5; m_ParseTime = 0; m_InsertTime = 0; m_TestedDevice = 0; m_PassedDevice = 0; m_FailedDevice = 0; m_Header = new DataHeader(); m_Bin = new Bin(); m_Bin.DeviceCount = new int[8]; m_Bin.Name = new string[8]; m_Bin.Number = new int[8]; m_Bin.Percent = new double[8]; m_Header.SessionCount = 0; #endregion *** Initialize properties *** //Timer session dtStart = DateTime.Now; STDFManager stdf = new STDFManager(STDFFileMode.Read, fileName); STDFRecord lineRecord = null; //sbData.Append(intDeviceCounter); while ((lineRecord = stdf.ReadRecord()) != null) { #region --- STDF File Version Check --- //STDF file version if (lineRecord.RECORD_TYPE == STDFRecordType.FAR) { int stdf_ver = int.Parse(((FARRecord)lineRecord).STDF_VER.ToString()); if (stdf_ver != 4) throw new Exception("Datalog is not in STDF_V4 fromat"); } #endregion --- STDF File Version Check --- #region --- Datalog Header Information --- // Lot information if (lineRecord.RECORD_TYPE == STDFRecordType.MIR) { string temp = ((MIRRecord)lineRecord).JOB_NAM; this.GetProgramNameRev(temp); m_Header.SessionCount++; m_Header.enVision_Version = ((MIRRecord)lineRecord).EXEC_VER; m_Header.LotID = ((MIRRecord)lineRecord).LOT_ID; m_Header.Tester = ((MIRRecord)lineRecord).NODE_NAM; m_Header.DeviceName = ((MIRRecord)lineRecord).PART_TYP; m_Header.SubLotID = ((MIRRecord)lineRecord).SBLOT_ID; m_Header.LotStartDateTime = ((MIRRecord)lineRecord).START_T; m_Header.TesterType = ((MIRRecord)lineRecord).TSTR_TYP; } if (lineRecord.RECORD_TYPE == STDFRecordType.MRR) { m_Header.LotFinishDateTime = ((MRRRecord)lineRecord).FINISH_T; m_Header.LotDesc = ((MRRRecord)lineRecord).USR_DESC; } // Device Count if (lineRecord.RECORD_TYPE == STDFRecordType.PCR) { m_TestedDevice = m_Header.TestQuantity = (int)((PCRRecord)lineRecord).PART_CNT; m_PassedDevice = m_Header.PassQuantity = (int)((PCRRecord)lineRecord).GOOD_CNT; m_FailedDevice = m_Header.FailQuantity = m_Header.TestQuantity - m_Header.PassQuantity; //Yield double yield = Convert.ToDouble(m_Header.PassQuantity) / Convert.ToDouble(m_Header.TestQuantity) * 100; m_Header.Yield = Math.Round(yield, 2); } #endregion Datalog header information try { #region --- Device Test Result --- while (lineRecord.RECORD_TYPE == STDFRecordType.PTR) { #region -- Parse PTR Data From STD File -- if (!isLimitSet) { if (((PTRRecord)lineRecord).UNITS.ToLower() == "s" && ((PTRRecord)lineRecord).SITE_NUM == 1) { sbColumnName.Append("," + ((PTRRecord)lineRecord).TEST_NUM); sbParameter.Append("," + ParameterParse(((PTRRecord)lineRecord).TEST_TXT)); sbLowLimit.Append("," + Math.Round(((PTRRecord)lineRecord).LO_LIMIT * 1000, 3)); sbHighLimit.Append("," + Math.Round(((PTRRecord)lineRecord).HI_LIMIT * 1000, 3)); sbUnits.Append(",m" + ((PTRRecord)lineRecord).UNITS); } else if (((PTRRecord)lineRecord).SITE_NUM == 1) { sbColumnName.Append("," + ((PTRRecord)lineRecord).TEST_NUM); sbParameter.Append("," + ParameterParse(((PTRRecord)lineRecord).TEST_TXT)); sbLowLimit.Append("," + ResultScale(((PTRRecord)lineRecord).LO_LIMIT, ((PTRRecord)lineRecord).RES_SCAL)); sbHighLimit.Append("," + ResultScale(((PTRRecord)lineRecord).HI_LIMIT, ((PTRRecord)lineRecord).RES_SCAL)); sbUnits.Append("," + UnitScale(((PTRRecord)lineRecord).UNITS, ((PTRRecord)lineRecord).RES_SCAL)); } } if (((PTRRecord)lineRecord).SITE_NUM == 1) { if (((PTRRecord)lineRecord).UNITS.ToLower() == "s") sbData1.Append("," + Math.Round(((PTRRecord)lineRecord).RESULT * 1000, 3)); else sbData1.Append("," + ResultScale(((PTRRecord)lineRecord).RESULT, ((PTRRecord)lineRecord).RES_SCAL)); } else if (((PTRRecord)lineRecord).SITE_NUM == 2) { if (((PTRRecord)lineRecord).UNITS.ToLower() == "s") sbData2.Append("," + Math.Round(((PTRRecord)lineRecord).RESULT * 1000, 3)); else sbData2.Append("," + ResultScale(((PTRRecord)lineRecord).RESULT, ((PTRRecord)lineRecord).RES_SCAL)); } lineRecord = stdf.ReadRecord(); //jump to PRR #endregion -- Parse ptr data from std file -- while (lineRecord.RECORD_TYPE == STDFRecordType.PRR) { #region -- Parse PRR Data From STD File -- // Parse Site#1 PRR Data if (((PRRRecord)lineRecord).SITE_NUM == 1) { if (((PRRRecord)lineRecord).PartPassed) PassFail1 = "Pass"; else PassFail1 = "Fail"; sbData1.Append("," + PassFail1); sbData1.Insert(0, intDeviceCounter + "," + ((PRRRecord)lineRecord).SITE_NUM.ToString() + "," + ((PRRRecord)lineRecord).SOFT_BIN.ToString() + "," + ((PRRRecord)lineRecord).HARD_BIN.ToString() + "," + ((PRRRecord)lineRecord).PART_ID.ToString()); } else // Parse Site#2 PRR Data { if (((PRRRecord)lineRecord).PartPassed) PassFail2 = "Pass"; else PassFail2 = "Fail"; sbData2.Append("," + PassFail2); sbData2.Insert(0, intDeviceCounter + "," + ((PRRRecord)lineRecord).SITE_NUM.ToString() + "," + ((PRRRecord)lineRecord).SOFT_BIN.ToString() + "," + ((PRRRecord)lineRecord).HARD_BIN.ToString() + "," + ((PRRRecord)lineRecord).PART_ID.ToString()); } #endregion -- Parse prrdata from std file -- #region -- Build Datatable and Insert limit info -- if (!isLimitSet) { ParameterLength = ((PRRRecord)lineRecord).NUM_TEST; intColumnLength = ParameterLength + 6; // Build Data Table sbColumnName.Append(",*"); string[] ColumnName = sbColumnName.ToString().Split(','); for (i = 0; i < ColumnName.Length; i++) { DataParseResult.Columns.Add(new DataColumn(ColumnName[i], typeof(string))); } //Insert Parameter string[] Parameter = sbParameter.ToString().Split(','); dr = DataParseResult.NewRow(); for (i = 0; i < intColumnLength - 1; i++) { dr[i] = Parameter[i]; } dr[i] = "Status"; DataParseResult.Rows.Add(dr); //Insert Units string[] Units = sbUnits.ToString().Split(','); dr = DataParseResult.NewRow(); for (i = 0; i < intColumnLength - 1; i++) { dr[i] = Units[i]; } DataParseResult.Rows.Add(dr); //Insert Low Limit string[] LowLimit = sbLowLimit.ToString().Split(','); dr = DataParseResult.NewRow(); for (i = 0; i < intColumnLength - 1; i++) { dr[i] = LowLimit[i]; } DataParseResult.Rows.Add(dr); //Insert High Limit string[] HighLimit = sbHighLimit.ToString().Split(','); dr = DataParseResult.NewRow(); for (i = 0; i < intColumnLength - 1; i++) { dr[i] = HighLimit[i]; } DataParseResult.Rows.Add(dr); isLimitSet = true; } #endregion Build Datatable #region -- Insert Test Data Result -- string[] Data; //Insert site#1 Test Data Result if (((PRRRecord)lineRecord).SITE_NUM == 1) { Data = sbData1.ToString().Split(','); } else //Insert site#2 Test Data Result { Data = sbData2.ToString().Split(','); } dr = DataParseResult.NewRow(); int j = intColumnLength; if (Data.Length < j) j = Data.Length; for (i = 0; i < j; i++) { dr[i] = Data[i]; } DataParseResult.Rows.Add(dr); #endregion Insert Test Data Result #region -- Next Device -- if (((PRRRecord)lineRecord).SITE_NUM == 1) sbData1 = new StringBuilder(); else sbData2 = new StringBuilder(); intDeviceCounter++; if ((lineRecord = stdf.ReadRecord()).RECORD_TYPE == STDFRecordType.PIR) //jump to PIR { lineRecord = stdf.ReadRecord(); //jump to PTR } #endregion -- Next Device -- } } #endregion --- Device Test Result --- } catch (Exception ex) { throw new Exception("Parse Data Error \r\n" + ex.Message); } } //Timer session ts = DateTime.Now - dtStart; ParseTime = ts.TotalMilliseconds; dtStart = DateTime.Now; DataParseResult.PrimaryKey = new DataColumn[] { DataParseResult.Columns[0] }; return DataParseResult; //throw new Exception("ooops"); }
///<summary> ///<para>Parse test data from LTX txt test result in to datatable</para> ///<seealso cref="DataParse.GetDataFromTxt"/> ///</summary> /// <param name="fileName">Full patch with file name of the txt file</param> /// <returns>DataTable</returns> public DataTable GetDataFromTxt(string fileName) { #region *** Variable define *** DateTime dtStart; TimeSpan ts; DataRow dr; DataTable DataParseResult = new DataTable(); StringBuilder sbDataString = new StringBuilder(); bool isDataHeaderGet = false; //bool isTestModeGet = false; bool isParseHeaderFinish = false; string lineConent = null; int intSiteNumber; int intSubStringStart = 18; int intDeviceCounter = 0; int intParameterCounter = 1; int intFixedParameterCounter = 1; int intisDataHeaderGetCount = 0; int intLineCount = 1; int intDeviceID = 0; string strParameterBuffer = "Test Item"; string strLowLimitBuffer = "Low Limit"; string strHighLimitBuffer = "High Limit"; string strUnitsBuffer = "Units"; string strParameterString = ""; string strLowLimitString = ""; string strHighLimitString = ""; string strUnitsString = ""; string strDataString = ""; string[] strOriginalData; string[] strTrimedData; #endregion *** Variable define *** #region *** Initialize properties *** m_FreezeColumn = 3; m_ParseTime = 0; m_InsertTime = 0; m_TestedDevice = 0; m_PassedDevice = 0; m_FailedDevice = 0; m_Header = new DataHeader(); m_Bin = new Bin(); m_Bin.DeviceCount = new int[8]; m_Bin.Name = new string[8]; m_Bin.Number = new int[8]; m_Bin.Percent = new double[8]; m_Header.SessionCount = 1; #endregion *** Initialize properties *** intSiteNumber = GetSiteNumber(fileName); //Single site if (intSiteNumber == 1) { #region *** Parse test data from txt file *** try { //Timer session dtStart = DateTime.Now; #region *** Read to memory *** //string content = string.Empty; //using (StreamReader ms_StreamReader = new StreamReader(fileName)) //{ // content = ms_StreamReader.ReadToEnd();//一次性读入内存 //} //MemoryStream _MemoryStream = new MemoryStream(Encoding.GetEncoding("GB2312").GetBytes(content));//放入内存流,以便逐行读取 //StreamReader _StreamReader = new StreamReader(_MemoryStream); //ts = DateTime.Now - dtStart; //ParseTime = ts.TotalMilliseconds; #endregion *** Read to memory *** #region *** Direct Read *** FileStream _FileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read); StreamReader _StreamReader = new StreamReader(_FileStream); _StreamReader.BaseStream.Seek(0, SeekOrigin.Begin); #endregion *** Diresct Read *** lineConent = _StreamReader.ReadLine(); intLineCount++; while (lineConent != null) { #region *** Header section *** #region *** Product & ProgramRev *** //Get product if (!isParseHeaderFinish && lineConent.Contains("Program Name")) { string temp = lineConent.Substring(intSubStringStart); string[] tempArray = temp.Split('_'); m_Header.Product = tempArray[0].Trim(); try { m_Header.ProgramRev = tempArray[1].Trim() + "." + tempArray[2].Trim() + "." + tempArray[3].Trim(); } catch { try { m_Header.ProgramRev = tempArray[1].Trim() + "." + tempArray[2].Trim(); } catch { m_Header.ProgramRev = tempArray[1].Trim(); } } lineConent = _StreamReader.ReadLine(); intLineCount++; } #endregion *** Product & ProgramRev *** #region *** StartTime *** //Get StartTime if (!isParseHeaderFinish && lineConent.Contains("Start Time")) { string temp = lineConent.Substring(intSubStringStart); string[] tempArray = temp.Split(' '); string[] tempArrayTrimed = new string[5]; StringBuilder _StringBuilder = new StringBuilder(); int j = 0; for (int i = 0; i < tempArray.Length; i++) { if (tempArray[i] != "") { tempArrayTrimed[j] = tempArray[i]; j++; } } _StringBuilder.Append(tempArrayTrimed[4]); //Year _StringBuilder.Append("/"); _StringBuilder.Append(tempArrayTrimed[1]); //Month _StringBuilder.Append("/"); _StringBuilder.Append(tempArrayTrimed[2]); //Day _StringBuilder.Append(" "); _StringBuilder.Append(tempArrayTrimed[3]); //Time m_Header.LotStartDateTime = Convert.ToDateTime(_StringBuilder.ToString()); lineConent = _StreamReader.ReadLine(); intLineCount++; } //end of is contains #endregion *** StartTime *** #region *** Device Name *** //Get Device Name if (!isParseHeaderFinish && lineConent.Contains("Device Name")) { string temp = lineConent.Substring(intSubStringStart); //m_Header.LotStartDateTime = temp.ToString(); m_Header.DeviceName = temp.Trim(); lineConent = _StreamReader.ReadLine(); intLineCount++; } //end of is contains #endregion *** Device Name *** #region *** Lot Retest *** //Get Lot Retest if (!isParseHeaderFinish && lineConent.Contains("Lot Retest")) { string temp = lineConent.Substring(intSubStringStart); //m_Header.LotStartDateTime = temp.ToString(); lineConent = _StreamReader.ReadLine(); intLineCount++; } //end of is contains #endregion *** Lot Retest *** #region *** LotID *** //Get LotID if (!isParseHeaderFinish && lineConent.Contains("Lot ID")) { string temp = lineConent.Substring(intSubStringStart); //string[] tempArray = temp.Split('_'); m_Header.LotID = temp.Trim(); lineConent = _StreamReader.ReadLine(); intLineCount++; } #endregion *** LotID *** #region *** Sub LotID *** //Get Sub LotID if (!isParseHeaderFinish && lineConent.Contains("Sublot ID")) { string temp = lineConent.Substring(intSubStringStart); //string[] tempArray = temp.Split('_'); m_Header.SubLotID = temp.Trim(); lineConent = _StreamReader.ReadLine(); intLineCount++; } #endregion *** SubLotID *** #region *** Tester *** //Get Tester if (!isParseHeaderFinish && lineConent.Contains("Tester Node Name")) { string temp = lineConent.Substring(intSubStringStart); m_Header.Tester = temp.Trim(); lineConent = _StreamReader.ReadLine(); intLineCount++; } #endregion *** Tester *** #region *** Test Head *** //Get Test Head if (!isParseHeaderFinish && lineConent.Contains("Test Head")) { string temp = lineConent.Substring(intSubStringStart); //m_Header.Tester = temp.Trim(); lineConent = _StreamReader.ReadLine(); intLineCount++; } #endregion *** Test Head *** #region *** TesterType *** //Get TesterType if (!isParseHeaderFinish && lineConent.Contains("Tester Type")) { string temp = lineConent.Substring(intSubStringStart); m_Header.TesterType = temp.Trim(); lineConent = _StreamReader.ReadLine(); intLineCount++; } #endregion *** TesterType *** #region *** Serial Number *** //Get Serial Number if (!isParseHeaderFinish && lineConent.Contains("Serial Number")) { string temp = lineConent.Substring(intSubStringStart); //m_Header.Tester = temp.Trim(); lineConent = _StreamReader.ReadLine(); intLineCount++; } #endregion *** Serial Number *** #region *** Operator ID *** //Get Operator ID if (!isParseHeaderFinish && lineConent.Contains("Operator ID")) { string temp = lineConent.Substring(intSubStringStart); m_Header.OperatorID = temp.Trim(); lineConent = _StreamReader.ReadLine(); intLineCount++; } #endregion *** Operator ID *** #region *** enVision Version *** //Get enVision Version if (!isParseHeaderFinish && lineConent.Contains("enVision Version")) { string temp = lineConent.Substring(intSubStringStart); m_Header.enVision_Version = temp.Trim(); lineConent = _StreamReader.ReadLine(); intLineCount++; } #endregion *** enVision Version *** #region *** FAB ID *** //Get FAB ID if (!isParseHeaderFinish && lineConent.Contains("FAB ID")) { string temp = lineConent.Substring(intSubStringStart); //m_Header.TesterType = temp.Trim(); lineConent = _StreamReader.ReadLine(); intLineCount++; } #endregion *** FAB ID *** #region *** Active Flow *** //Get Active Flow if (!isParseHeaderFinish && lineConent.Contains("Active Flow")) { string temp = lineConent.Substring(intSubStringStart); //m_Header.Tester = temp.Trim(); isParseHeaderFinish = true; lineConent = _StreamReader.ReadLine(); intLineCount++; } #endregion *** Active Flow *** #region *** Software Bin Summary *** ////Get Software Bin Summary //if (lineConent.Contains("Software Bin Summary")) //{ // int j = 0; // int BinCount = 0; // string[] tempArrayTrim = new string[5]; // lineConent = _StreamReader.ReadLine(); intLineCount++; // lineConent = _StreamReader.ReadLine(); intLineCount++; // lineConent = _StreamReader.ReadLine(); intLineCount++; // while (lineConent != "" && BinCount < 8) // { // string[] tempArray = lineConent.Split(' '); // for (int i = 0; i < tempArray.Length; i++) // { // if (tempArray[i] != "") // { // tempArrayTrim[j] = tempArray[i]; // j++; // } // } // m_Bin.Number[BinCount] = Convert.ToInt32(tempArrayTrim[0]); // m_Bin.DeviceCount[BinCount] = Convert.ToInt32(tempArrayTrim[2]); // m_Bin.Percent[BinCount] = Convert.ToDouble(tempArrayTrim[3]); // m_Bin.Name[BinCount] = tempArrayTrim[4]; // lineConent = _StreamReader.ReadLine(); intLineCount++; // BinCount++; // j = 0; // } //end of while (strline != "") // lineConent = _StreamReader.ReadLine(); intLineCount++; // lineConent = _StreamReader.ReadLine(); intLineCount++; //jump to Device Count Summary //}//end of if contains #endregion *** Software Bin Summary *** //not calc #region *** Device Count Summary *** //Get Device Count Summary if (lineConent.Contains("Device Count Summary")) { lineConent = _StreamReader.ReadLine(); intLineCount++; lineConent = _StreamReader.ReadLine(); intLineCount++; lineConent = _StreamReader.ReadLine(); intLineCount++; string temp = lineConent.Substring(intSubStringStart); string[] tempArray = temp.Split(' '); string[] tempArrayTrimed = new string[5]; int j = 0; for (int i = 0; i < tempArray.Length; i++) { if (tempArray[i] != "") { tempArrayTrimed[j] = tempArray[i]; j++; } } m_TestedDevice = m_Header.TestQuantity = Convert.ToInt32(tempArrayTrimed[0]); m_PassedDevice = m_Header.PassQuantity = Convert.ToInt32(tempArrayTrimed[1]); m_FailedDevice = m_Header.FailQuantity = m_Header.TestQuantity - m_Header.PassQuantity; //Yield double yield = Convert.ToDouble(m_Header.PassQuantity) / Convert.ToDouble(m_Header.TestQuantity) * 100; m_Header.Yield = Math.Round(yield, 2); lineConent = _StreamReader.ReadLine(); intLineCount++; lineConent = _StreamReader.ReadLine(); intLineCount++; lineConent = _StreamReader.ReadLine(); intLineCount++; // jump to lot finish time }//end of if strline.Contains #endregion *** Device Count Summary *** #region *** Finish Time *** //Get Finish Time if (lineConent.Contains("Finish Time")) { string temp = lineConent.Substring(intSubStringStart); string[] tempArray = temp.Split(' '); string[] tempArrayTrimed = new string[5]; StringBuilder _StringBuilder = new StringBuilder(); int j = 0; for (int i = 0; i < tempArray.Length; i++) { if (tempArray[i] != "") { tempArrayTrimed[j] = tempArray[i]; j++; } } _StringBuilder.Append(tempArrayTrimed[4]); //Year _StringBuilder.Append("/"); _StringBuilder.Append(tempArrayTrimed[1]); //Month _StringBuilder.Append("/"); _StringBuilder.Append(tempArrayTrimed[2]); //Day _StringBuilder.Append(" "); _StringBuilder.Append(tempArrayTrimed[3]); //Time m_Header.LotFinishDateTime = Convert.ToDateTime(_StringBuilder.ToString()); lineConent = _StreamReader.ReadLine(); intLineCount++; } //end of if contains #endregion *** StartTime *** #region *** Lot Description *** //Get FAB ID if (!isParseHeaderFinish && lineConent.Contains("Lot Description")) { string temp = lineConent.Substring(intSubStringStart); //m_Header.TesterType = temp.Trim(); m_Header.LotDesc = temp.Trim(); lineConent = _StreamReader.ReadLine(); intLineCount++; } #endregion *** FAB ID *** #region *** Test Mode *** ////Get Test //if (isParseHeaderFinish && !isTestModeGet) //{ // string lotName = ""; // if (m_Header.LotID != null) // lotName = m_Header.LotID; // else // lotName = m_Header.SubLotID; // string[] temp = lotName.Split('_'); // m_Header.TestMode = temp[1].Trim(); // isTestModeGet = true; //} #endregion *** Test Mode *** #endregion *** Header section *** #region *** Device section *** if (lineConent.Contains("Test Description")) { lineConent = _StreamReader.ReadLine(); intLineCount++; lineConent = _StreamReader.ReadLine(); intLineCount++; //Jump to GSM idle Current //accumulative parameter counter intDeviceCounter++; //Reset parameter counter intParameterCounter = 0; //Reset Header buffer strParameterBuffer = "Test Item,Site No,Device ID"; strLowLimitBuffer = "Low Limit,,"; strHighLimitBuffer = "High Limit,,"; strUnitsBuffer = "Units,,"; if (intDeviceCounter == 1) sbDataString.Append(intDeviceCounter); else { sbDataString.Append("&"); sbDataString.Append(intDeviceCounter); } // identify enVision string enVer = m_Header.enVision_Version.Substring(0, 5); if (enVer == "R12.5") // CX R12.5.5 { #region *** Single device data *** //Get test result and get data header at fisrt device while (lineConent != "") { //strline = strline.Trim(); strOriginalData = lineConent.Split(' '); int i, j = 0; strTrimedData = new string[15]; //trim data string for (i = 0; i < strOriginalData.Length; i++) { if (strOriginalData[i] != "") { strTrimedData[j] = strOriginalData[i]; j++; } } //Get data header if (!isDataHeaderGet) { if (strTrimedData[1] == "F") { strParameterBuffer += "," + strTrimedData[9]; strLowLimitBuffer += "," + strTrimedData[3]; strHighLimitBuffer += "," + strTrimedData[7]; strUnitsBuffer += "," + strTrimedData[4]; } else { strParameterBuffer += "," + strTrimedData[8]; strLowLimitBuffer += "," + strTrimedData[2]; strHighLimitBuffer += "," + strTrimedData[6]; strUnitsBuffer += "," + strTrimedData[3]; } } //Get device test result if (strTrimedData[1] == "F") { sbDataString.Append(","); sbDataString.Append(strTrimedData[5]); //strDataString += "," + strTrimedData[5]; } else { sbDataString.Append(","); sbDataString.Append(strTrimedData[4]); //strDataString += "," + strTrimedData[4]; }//Read next parameter lineConent = _StreamReader.ReadLine(); intLineCount++; //accumulative parameter counter intParameterCounter++; } #region Get site & actual device number //Get site & actual device number lineConent = _StreamReader.ReadLine(); intLineCount++; lineConent = _StreamReader.ReadLine(); intLineCount++; lineConent = _StreamReader.ReadLine(); intLineCount++; lineConent = _StreamReader.ReadLine(); intLineCount++; lineConent = _StreamReader.ReadLine(); intLineCount++;//Jump to Site & actual device number strOriginalData = lineConent.Split(' '); sbDataString.Append(","); sbDataString.Append(strOriginalData[5]); // Site number sbDataString.Append(","); sbDataString.Append(strOriginalData[7]); // Actual device number #endregion Get site & actual device number #endregion *** Single device data *** } else if (enVer == "R15.7") // PAx R15.7.1 { #region *** Single device data *** //Get test result and get data header at fisrt device while (lineConent != "") { //strline = strline.Trim(); strOriginalData = new string[8]; strTrimedData = new string[7]; int i, j = 0; strTrimedData[0] = lineConent.Substring(11, 10).Trim(); //Low limt strTrimedData[1] = lineConent.Substring(28, 10).Trim(); //High limit strTrimedData[2] = lineConent.Substring(38, 5).Trim(); //Units strTrimedData[3] = lineConent.Substring(48, 10).Trim(); //Site#1 result strTrimedData[4] = lineConent.Substring(68).Trim(); //Parameter name strTrimedData[6] = lineConent.Substring(58, 3).Trim(); //Site#1 unit ////trim data string //for (i = 0; i < strOriginalData.Length; i++) //{ // strTrimedData[i] = strOriginalData[i].Trim(); //} //Get data header if (!isDataHeaderGet) { strParameterBuffer += "," + strTrimedData[4]; strLowLimitBuffer += "," + strTrimedData[0]; if (strTrimedData[2].ToLower() == "ks") { strTrimedData[1] = (Convert.ToDouble(strTrimedData[1]) * 1000 * 1000).ToString(); strHighLimitBuffer += "," + strTrimedData[1]; strUnitsBuffer += "," + "ms"; } else { strHighLimitBuffer += "," + strTrimedData[1]; strUnitsBuffer += "," + strTrimedData[2]; } } //Get site#1 device test result sbDataString.Append(","); if (strTrimedData[6].ToLower() == "s") { sbDataString.Append(Convert.ToDouble(strTrimedData[3]) * 1000); } else if (strTrimedData[6].ToLower() == "ks") { sbDataString.Append(Convert.ToDouble(strTrimedData[3]) * 1000 * 1000); } else { sbDataString.Append(strTrimedData[3]); } //Read next parameter lineConent = _StreamReader.ReadLine(); intLineCount++; //accumulative parameter counter intParameterCounter++; } #region Get site & actual device number //Get site & actual device number bool isSiteInfoGet = false; while (!isSiteInfoGet) { lineConent = _StreamReader.ReadLine(); intLineCount++; if (lineConent.Contains("Device Results:")) { lineConent = _StreamReader.ReadLine(); intLineCount++; lineConent = _StreamReader.ReadLine(); intLineCount++; lineConent = _StreamReader.ReadLine(); intLineCount++;//Jump to Site#1 & actual device number strOriginalData = new string[15]; strOriginalData = lineConent.Split(' '); sbDataString.Append(","); sbDataString.Append(strOriginalData[5]); // Site number sbDataString.Append(","); sbDataString.Append(strOriginalData[7]); // Actual device number isSiteInfoGet = true; } //end of if (lineConent.Contains("Device Results:")) } //end of while (isSiteInfoGet) #endregion Get site & actual device number #endregion *** Single device data *** } //Detemine if data header is complete if (!isDataHeaderGet) { if (strParameterString.Length < strParameterBuffer.Length) { strParameterString = strParameterBuffer; strUnitsString = strUnitsBuffer; strLowLimitString = strLowLimitBuffer; strHighLimitString = strHighLimitBuffer; intFixedParameterCounter = intParameterCounter; //intisDataHeaderGetCount = 0; } else { // intisDataHeaderGetCount++; // if (intisDataHeaderGetCount > 10) isDataHeaderGet = true; } } //Check if any error on the data parse if (intParameterCounter != intFixedParameterCounter) { throw new Exception("Previous parameter count is: " + intFixedParameterCounter.ToString() + "\nCurrent parameter count is: " + intParameterCounter.ToString()); } } #endregion *** Device section *** //Jump to next device lineConent = _StreamReader.ReadLine(); intLineCount++; } strDataString = sbDataString.ToString(); } catch (Exception ex) { throw new Exception("Parse data error \n " + ex.Message); } //Timer session ts = DateTime.Now - dtStart; ParseTime = ts.TotalMilliseconds; dtStart = DateTime.Now; #endregion *** Parse test data from txt file *** #region *** Parse string into datatable *** try { //Timer session dtStart = DateTime.Now; //Generate Column string[] Parameter = strParameterString.Split(','); int intColumnLength = Parameter.Length; int i; for (i = 0; i < intColumnLength + 1; i++) { if (i == 0) DataParseResult.Columns.Add(new DataColumn("Device#", typeof(string))); else DataParseResult.Columns.Add(new DataColumn(i.ToString(), typeof(string))); } //DataParseResult.Columns.Add(new DataColumn(i.ToString(), typeof(string))); //add Status column //Insert Parameter dr = DataParseResult.NewRow(); for (i = 0; i < intColumnLength; i++) { dr[i] = Parameter[i]; } dr[i] = "Status"; DataParseResult.Rows.Add(dr); //Insert Units string[] Units = strUnitsString.Split(','); dr = DataParseResult.NewRow(); for (i = 0; i < intColumnLength; i++) { dr[i] = Units[i]; } DataParseResult.Rows.Add(dr); //Insert Low Limit string[] LowLimit = strLowLimitString.Split(','); dr = DataParseResult.NewRow(); for (i = 0; i < intColumnLength; i++) { dr[i] = LowLimit[i]; } DataParseResult.Rows.Add(dr); //Insert High Limit string[] HighLimit = strHighLimitString.Split(','); dr = DataParseResult.NewRow(); for (i = 0; i < intColumnLength; i++) { dr[i] = HighLimit[i]; } DataParseResult.Rows.Add(dr); //Insert Test Data string[] Device = strDataString.Split('&'); int intDeviceCount = Device.Length; //m_TestedDevice = intDeviceCount; for (i = 0; i < intDeviceCount; i++) { bool PassStatus = true; string[] DeviceData = Device[i].Split(','); dr = DataParseResult.NewRow(); if (DeviceData.Length > Parameter.Length) throw new Exception("DeviceData.Length = " + DeviceData.Length.ToString() + " / Parameter.Length = " + Parameter.Length.ToString() + "DeviceID = " + i.ToString()); dr[0] = DeviceData[0]; for (int j = 1; j < DeviceData.Length; j++) { if (j < 3) dr[j] = DeviceData[j + DeviceData.Length - 3]; else { dr[j] = DeviceData[j - 2]; try { if ((Convert.ToDouble(DeviceData[j - 2]) < Convert.ToDouble(LowLimit[j]) || Convert.ToDouble(DeviceData[j - 2]) > Convert.ToDouble(HighLimit[j]))) { PassStatus = false; } } catch (Exception ex) { //throw new Exception("DeviceID = " + i.ToString() + " / " + ex.Message); dr[j] = Convert.ToString(-99); PassStatus = false; } } } if (PassStatus) { dr[DataParseResult.Columns.Count - 1] = "Pass"; //m_PassedDevice++; } else { dr[DataParseResult.Columns.Count - 1] = "Fail"; //m_FailedDevice++; } DataParseResult.Rows.Add(dr); } //Timer session ts = DateTime.Now - dtStart; InsertTime = ts.TotalMilliseconds; } catch (Exception ex) { throw new Exception("Insert into datatable error \n " + ex.Message); } #endregion Parse string into datatable } //Dual site else if (intSiteNumber == 2) { #region *** Parse test data from txt file *** try { //Timer session dtStart = DateTime.Now; #region *** Read to memory *** //string content = string.Empty; //using (StreamReader ms_StreamReader = new StreamReader(fileName)) //{ // content = ms_StreamReader.ReadToEnd();//一次性读入内存 //} //MemoryStream _MemoryStream = new MemoryStream(Encoding.GetEncoding("GB2312").GetBytes(content));//放入内存流,以便逐行读取 //StreamReader _StreamReader = new StreamReader(_MemoryStream); //ts = DateTime.Now - dtStart; //ParseTime = ts.TotalMilliseconds; #endregion *** Read to memory *** #region *** Direct Read *** FileStream _FileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read); StreamReader _StreamReader = new StreamReader(_FileStream); _StreamReader.BaseStream.Seek(0, SeekOrigin.Begin); #endregion *** Diresct Read *** intDeviceCounter = 1; lineConent = _StreamReader.ReadLine(); while (lineConent != null) { #region *** Header section *** #region *** Product & ProgramRev *** //Get product if (!isParseHeaderFinish && lineConent.Contains("Program Name")) { string temp = lineConent.Substring(intSubStringStart); string[] tempArray = temp.Split('_'); m_Header.Product = tempArray[0].Trim(); try { m_Header.ProgramRev = tempArray[1].Trim() + "." + tempArray[2].Trim() + "." + tempArray[3].Trim(); } catch { try { m_Header.ProgramRev = tempArray[1].Trim() + "." + tempArray[2].Trim(); } catch { m_Header.ProgramRev = tempArray[1].Trim(); } } lineConent = _StreamReader.ReadLine(); intLineCount++; } #endregion *** Product & ProgramRev *** #region *** StartTime *** //Get StartTime if (!isParseHeaderFinish && lineConent.Contains("Start Time")) { string temp = lineConent.Substring(intSubStringStart); string[] tempArray = temp.Split(' '); string[] tempArrayTrimed = new string[5]; StringBuilder _StringBuilder = new StringBuilder(); int j = 0; for (int i = 0; i < tempArray.Length; i++) { if (tempArray[i] != "") { tempArrayTrimed[j] = tempArray[i]; j++; } } _StringBuilder.Append(tempArrayTrimed[4]); //Year _StringBuilder.Append("/"); _StringBuilder.Append(tempArrayTrimed[1]); //Month _StringBuilder.Append("/"); _StringBuilder.Append(tempArrayTrimed[2]); //Day _StringBuilder.Append(" "); _StringBuilder.Append(tempArrayTrimed[3]); //Time m_Header.LotStartDateTime = Convert.ToDateTime(_StringBuilder.ToString()); lineConent = _StreamReader.ReadLine(); intLineCount++; } //end of is contains #endregion *** StartTime *** #region *** Device Name *** //Get Device Name if (!isParseHeaderFinish && lineConent.Contains("Device Name")) { string temp = lineConent.Substring(intSubStringStart); //m_Header.LotStartDateTime = temp.ToString(); m_Header.DeviceName = temp.Trim(); lineConent = _StreamReader.ReadLine(); intLineCount++; } //end of is contains #endregion *** Device Name *** #region *** Lot Retest *** //Get Lot Retest if (!isParseHeaderFinish && lineConent.Contains("Lot Retest")) { string temp = lineConent.Substring(intSubStringStart); //m_Header.LotStartDateTime = temp.ToString(); lineConent = _StreamReader.ReadLine(); intLineCount++; } //end of is contains #endregion *** Lot Retest *** #region *** LotID *** //Get LotID if (!isParseHeaderFinish && lineConent.Contains("Lot ID")) { string temp = lineConent.Substring(intSubStringStart); //string[] tempArray = temp.Split('_'); m_Header.LotID = temp.Trim(); lineConent = _StreamReader.ReadLine(); intLineCount++; } #endregion *** LotID *** #region *** Sub LotID *** //Get Sub LotID if (!isParseHeaderFinish && lineConent.Contains("Sublot ID")) { string temp = lineConent.Substring(intSubStringStart); //string[] tempArray = temp.Split('_'); m_Header.SubLotID = temp.Trim(); lineConent = _StreamReader.ReadLine(); intLineCount++; } #endregion *** SubLotID *** #region *** Tester *** //Get Tester if (!isParseHeaderFinish && lineConent.Contains("Tester Node Name")) { string temp = lineConent.Substring(intSubStringStart); m_Header.Tester = temp.Trim(); lineConent = _StreamReader.ReadLine(); intLineCount++; } #endregion *** Tester *** #region *** Test Head *** //Get Test Head if (!isParseHeaderFinish && lineConent.Contains("Test Head")) { string temp = lineConent.Substring(intSubStringStart); //m_Header.Tester = temp.Trim(); lineConent = _StreamReader.ReadLine(); intLineCount++; } #endregion *** Test Head *** #region *** TesterType *** //Get TesterType if (!isParseHeaderFinish && lineConent.Contains("Tester Type")) { string temp = lineConent.Substring(intSubStringStart); m_Header.TesterType = temp.Trim(); lineConent = _StreamReader.ReadLine(); intLineCount++; } #endregion *** TesterType *** #region *** Serial Number *** //Get Serial Number if (!isParseHeaderFinish && lineConent.Contains("Serial Number")) { string temp = lineConent.Substring(intSubStringStart); //m_Header.Tester = temp.Trim(); lineConent = _StreamReader.ReadLine(); intLineCount++; } #endregion *** Serial Number *** #region *** Operator ID *** //Get Operator ID if (!isParseHeaderFinish && lineConent.Contains("Operator ID")) { string temp = lineConent.Substring(intSubStringStart); m_Header.OperatorID = temp.Trim(); lineConent = _StreamReader.ReadLine(); intLineCount++; } #endregion *** Operator ID *** #region *** enVision Version *** //Get enVision Version if (!isParseHeaderFinish && lineConent.Contains("enVision Version")) { string temp = lineConent.Substring(intSubStringStart); m_Header.enVision_Version = temp.Trim(); lineConent = _StreamReader.ReadLine(); intLineCount++; } #endregion *** enVision Version *** #region *** FAB ID *** //Get FAB ID if (!isParseHeaderFinish && lineConent.Contains("FAB ID")) { string temp = lineConent.Substring(intSubStringStart); //m_Header.TesterType = temp.Trim(); lineConent = _StreamReader.ReadLine(); intLineCount++; } #endregion *** FAB ID *** #region *** Active Flow *** //Get Active Flow if (!isParseHeaderFinish && lineConent.Contains("Active Flow")) { string temp = lineConent.Substring(intSubStringStart); //m_Header.Tester = temp.Trim(); isParseHeaderFinish = true; lineConent = _StreamReader.ReadLine(); intLineCount++; } #endregion *** Active Flow *** #region *** Software Bin Summary *** //Get Software Bin Summary //if (lineConent.Contains("Software Bin Summary")) //{ // int j = 0; // int BinCount = 0; // string[] tempArrayTrim = new string[5]; // lineConent = _StreamReader.ReadLine(); intLineCount++; // lineConent = _StreamReader.ReadLine(); intLineCount++; // lineConent = _StreamReader.ReadLine(); intLineCount++; // while (lineConent != "" && BinCount < 7) // { // string[] tempArray = lineConent.Split(' '); // for (int i = 0; i < tempArray.Length; i++) // { // if (tempArray[i] != "") // { // tempArrayTrim[j] = tempArray[i]; // j++; // } // } // m_Bin.Number[BinCount] = Convert.ToInt32(tempArrayTrim[0]); // m_Bin.DeviceCount[BinCount] = Convert.ToInt32(tempArrayTrim[2]); // m_Bin.Percent[BinCount] = Convert.ToDouble(tempArrayTrim[3]); // m_Bin.Name[BinCount] = tempArrayTrim[4]; // lineConent = _StreamReader.ReadLine(); intLineCount++; // BinCount++; // j = 0; // } //end of while (strline != "") // //lineConent = _StreamReader.ReadLine(); intLineCount++; // lineConent = _StreamReader.ReadLine(); intLineCount++; //jump to Device Count Summary //}//end of if contains #endregion *** Software Bin Summary *** #region *** Device Count Summary *** //Get Device Count Summary if (lineConent.Contains("Device Count Summary")) { lineConent = _StreamReader.ReadLine(); intLineCount++; lineConent = _StreamReader.ReadLine(); intLineCount++; lineConent = _StreamReader.ReadLine(); intLineCount++; string temp = lineConent.Substring(intSubStringStart); string[] tempArray = temp.Split(' '); string[] tempArrayTrimed = new string[5]; int j = 0; for (int i = 0; i < tempArray.Length; i++) { if (tempArray[i] != "") { tempArrayTrimed[j] = tempArray[i]; j++; } } m_TestedDevice = m_Header.TestQuantity = Convert.ToInt32(tempArrayTrimed[0]); m_PassedDevice = m_Header.PassQuantity = Convert.ToInt32(tempArrayTrimed[1]); m_FailedDevice = m_Header.FailQuantity = m_Header.TestQuantity - m_Header.PassQuantity; //Yield double yield = Convert.ToDouble(m_Header.PassQuantity) / Convert.ToDouble(m_Header.TestQuantity) * 100; m_Header.Yield = Math.Round(yield, 2); lineConent = _StreamReader.ReadLine(); intLineCount++; lineConent = _StreamReader.ReadLine(); intLineCount++; lineConent = _StreamReader.ReadLine(); intLineCount++; // jump to lot finish time }//end of if strline.Contains #endregion *** Device Count Summary *** #region *** Finish Time *** //Get Finish Time if (lineConent.Contains("Finish Time")) { string temp = lineConent.Substring(intSubStringStart); string[] tempArray = temp.Split(' '); string[] tempArrayTrimed = new string[5]; StringBuilder _StringBuilder = new StringBuilder(); int j = 0; for (int i = 0; i < tempArray.Length; i++) { if (tempArray[i] != "") { tempArrayTrimed[j] = tempArray[i]; j++; } } _StringBuilder.Append(tempArrayTrimed[4]); //Year _StringBuilder.Append("/"); _StringBuilder.Append(tempArrayTrimed[1]); //Month _StringBuilder.Append("/"); _StringBuilder.Append(tempArrayTrimed[2]); //Day _StringBuilder.Append(" "); _StringBuilder.Append(tempArrayTrimed[3]); //Time m_Header.LotFinishDateTime = Convert.ToDateTime(_StringBuilder.ToString()); lineConent = _StreamReader.ReadLine(); intLineCount++; } //end of if contains #endregion *** StartTime *** #region *** Lot Description *** //Get FAB ID if (lineConent.Contains("Lot Description")) { string temp = lineConent.Substring(intSubStringStart); //m_Header.TesterType = temp.Trim(); m_Header.LotDesc = temp.Trim(); lineConent = _StreamReader.ReadLine(); intLineCount++; } #endregion *** FAB ID *** #region *** Test Mode *** ////Get Test //if (isParseHeaderFinish && !isTestModeGet) //{ // string lotName = ""; // if (m_Header.LotID != null) // lotName = m_Header.LotID; // else // lotName = m_Header.SubLotID; // string[] temp = lotName.Split('_'); // m_Header.TestMode = temp[1].Trim(); // isTestModeGet = true; //} #endregion *** Test Mode *** #endregion *** Header section *** #region *** Device section *** if (lineConent.Contains("Test Description")) { lineConent = _StreamReader.ReadLine(); intLineCount++; lineConent = _StreamReader.ReadLine(); intLineCount++; //Jump to GSM idle Current ////accumulative parameter counter //intDeviceCounter++; //Reset parameter counter intParameterCounter = 0; //Reset Header buffer strParameterBuffer = "Test Item,Site No,Device ID"; strLowLimitBuffer = "Low Limit,,"; strHighLimitBuffer = "High Limit,,"; strUnitsBuffer = "Units,,"; StringBuilder sbSite1DataTemp = new StringBuilder(); StringBuilder sbSite2DataTemp = new StringBuilder(); sbSite1DataTemp.Append(intDeviceCounter); sbSite2DataTemp.Append(intDeviceCounter + 1); #region *** Single device data *** //Get test result and get data header at fisrt device while (lineConent != "" && lineConent != null) { //strline = strline.Trim(); strOriginalData = new string[8]; strTrimedData = new string[8]; int i; try { strTrimedData[0] = lineConent.Substring(11, 10).Trim(); //Low limt strTrimedData[1] = lineConent.Substring(28, 10).Trim(); //High limit strTrimedData[2] = lineConent.Substring(38, 5).Trim(); //Units strTrimedData[3] = lineConent.Substring(48, 10).Trim(); //Site#1 result strTrimedData[4] = lineConent.Substring(68, 10).Trim(); //Site#2 result strTrimedData[5] = lineConent.Substring(100).Trim(); //Parameter name strTrimedData[6] = lineConent.Substring(58, 3).Trim(); //Site#1 unit strTrimedData[7] = lineConent.Substring(78, 3).Trim(); //Site#2 unit } catch (Exception ex) { throw new Exception(ex.Message); } ////trim data string //for (i = 0; i < strOriginalData.Length; i++) //{ // strTrimedData[i] = strOriginalData[i].Trim(); //} //Get data header if (!isDataHeaderGet) { strParameterBuffer += "," + strTrimedData[5]; strLowLimitBuffer += "," + strTrimedData[0]; if (strTrimedData[2].ToLower() == "ks") { strTrimedData[1] = (Convert.ToDouble(strTrimedData[1]) * 1000 * 1000).ToString(); strHighLimitBuffer += "," + strTrimedData[1]; strUnitsBuffer += "," + "ms"; } else { strHighLimitBuffer += "," + strTrimedData[1]; strUnitsBuffer += "," + strTrimedData[2]; } } //Get site#1 device test result sbSite1DataTemp.Append(","); //Site#1 data if (strTrimedData[6].ToLower() == "s") { sbSite1DataTemp.Append(Convert.ToDouble(strTrimedData[3]) * 1000); } else if (strTrimedData[6].ToLower() == "ks") { sbSite1DataTemp.Append(Convert.ToDouble(strTrimedData[3]) * 1000 * 1000); } else { sbSite1DataTemp.Append(strTrimedData[3]); } //Get site#2 device test result sbSite2DataTemp.Append(","); //Site#2 data if (strTrimedData[7].ToLower() == "s") { sbSite2DataTemp.Append(Convert.ToDouble(strTrimedData[4]) * 1000); } else if (strTrimedData[7].ToLower() == "ks") { sbSite2DataTemp.Append(Convert.ToDouble(strTrimedData[4]) * 1000); } else { sbSite2DataTemp.Append(strTrimedData[4]); } //Read next parameter lineConent = _StreamReader.ReadLine(); intLineCount++; //accumulative parameter counter intParameterCounter++; } #region Get site & actual device number //Get site & actual device number bool isSiteInfoGet = false; while (!isSiteInfoGet && lineConent != null) { lineConent = _StreamReader.ReadLine(); intLineCount++; if (lineConent.Contains("Device Results:")) { lineConent = _StreamReader.ReadLine(); intLineCount++; lineConent = _StreamReader.ReadLine(); intLineCount++; lineConent = _StreamReader.ReadLine(); intLineCount++;//Jump to Site#1 & actual device number strOriginalData = new string[15]; strOriginalData = lineConent.Split(' '); if (Convert.ToInt32(strOriginalData[5]) == 1) { sbSite1DataTemp.Append(","); sbSite1DataTemp.Append(strOriginalData[5]); // Site number sbSite1DataTemp.Append(","); sbSite1DataTemp.Append(strOriginalData[7]); // Actual device number if (intDeviceCounter == 1) sbDataString.Append(sbSite1DataTemp.ToString()); else { sbDataString.Append("&"); sbDataString.Append(sbSite1DataTemp.ToString()); } } else if (Convert.ToInt32(strOriginalData[5]) == 2) // if only site#2, dispose site#1 data { int a = sbSite2DataTemp.ToString().IndexOf(","); sbSite2DataTemp.Remove(0, a); sbSite2DataTemp.Insert(0, intDeviceCounter); sbSite2DataTemp.Append(","); sbSite2DataTemp.Append(strOriginalData[5]); // Site number sbSite2DataTemp.Append(","); sbSite2DataTemp.Append(strOriginalData[7]); // Actual device number if (intDeviceCounter == 1) sbDataString.Append(sbSite2DataTemp.ToString()); else { sbDataString.Append("&"); sbDataString.Append(sbSite2DataTemp.ToString()); } } intDeviceCounter++; //Jump to next site & actual device number lineConent = _StreamReader.ReadLine(); intLineCount++; if (lineConent != "") { strOriginalData = new string[15]; strOriginalData = lineConent.Split(' '); sbSite2DataTemp.Append(","); sbSite2DataTemp.Append(strOriginalData[5]); // Site number sbSite2DataTemp.Append(","); sbSite2DataTemp.Append(strOriginalData[7]); // Actual device number intDeviceID = Convert.ToInt32(strOriginalData[7]); intDeviceCounter++; sbDataString.Append("&"); sbDataString.Append(sbSite2DataTemp.ToString()); //Jump to next site & actual device number lineConent = _StreamReader.ReadLine(); intLineCount++; } isSiteInfoGet = true; } //end of if (lineConent.Contains("Device Results:")) } //end of while (isSiteInfoGet) #endregion Get site & actual device number #endregion *** Single device data *** //Detemine if data header is complete if (!isDataHeaderGet) { if (strParameterString.Length < strParameterBuffer.Length) { strParameterString = strParameterBuffer; strUnitsString = strUnitsBuffer; strLowLimitString = strLowLimitBuffer; strHighLimitString = strHighLimitBuffer; intFixedParameterCounter = intParameterCounter; //intisDataHeaderGetCount = 0; } else { // intisDataHeaderGetCount++; // if (intisDataHeaderGetCount > 1000) isDataHeaderGet = true; } } //Check if any error on the data parse if (intParameterCounter != intFixedParameterCounter) { throw new Exception("Previous parameter count is: " + intFixedParameterCounter.ToString() + "\nCurrent parameter count is: " + intParameterCounter.ToString()); } } #endregion *** Device section *** //Jump to next device lineConent = _StreamReader.ReadLine(); intLineCount++; } strDataString = sbDataString.ToString(); } catch (Exception ex) { throw new Exception("Parse data error \n Line Number: " + intLineCount.ToString() + " \n Device ID " + intDeviceID.ToString() + "\n\n" + ex.Message); } //Timer session ts = DateTime.Now - dtStart; ParseTime = ts.TotalMilliseconds; dtStart = DateTime.Now; #endregion *** Parse test data from txt file *** #region *** Parse string into datatable *** try { //Timer session dtStart = DateTime.Now; //Generate Column string[] Parameter = strParameterString.Split(','); int intColumnLength = Parameter.Length; int i; for (i = 0; i < intColumnLength + 1; i++) { if (i == 0) DataParseResult.Columns.Add(new DataColumn("Device#", typeof(string))); else DataParseResult.Columns.Add(new DataColumn(i.ToString(), typeof(string))); } //DataParseResult.Columns.Add(new DataColumn(i.ToString(), typeof(string))); //add Status column //Insert Parameter dr = DataParseResult.NewRow(); for (i = 0; i < intColumnLength; i++) { dr[i] = Parameter[i]; } dr[i] = "Status"; DataParseResult.Rows.Add(dr); //Insert Units string[] Units = strUnitsString.Split(','); dr = DataParseResult.NewRow(); for (i = 0; i < intColumnLength; i++) { dr[i] = Units[i]; } DataParseResult.Rows.Add(dr); //Insert Low Limit string[] LowLimit = strLowLimitString.Split(','); dr = DataParseResult.NewRow(); for (i = 0; i < intColumnLength; i++) { dr[i] = LowLimit[i]; } DataParseResult.Rows.Add(dr); //Insert High Limit string[] HighLimit = strHighLimitString.Split(','); dr = DataParseResult.NewRow(); for (i = 0; i < intColumnLength; i++) { dr[i] = HighLimit[i]; } DataParseResult.Rows.Add(dr); //Insert Test Data string[] Device = strDataString.Split('&'); int intDeviceCount = Device.Length; //m_TestedDevice = intDeviceCount; for (i = 0; i < intDeviceCount; i++) { bool PassStatus = true; string[] DeviceData = Device[i].Split(','); dr = DataParseResult.NewRow(); if (DeviceData.Length > Parameter.Length) throw new Exception("DeviceData.Length = " + DeviceData.Length.ToString() + " / Parameter.Length = " + Parameter.Length.ToString()); dr[0] = DeviceData[0]; for (int j = 1; j < DeviceData.Length; j++) { if (j < 3) dr[j] = DeviceData[j + DeviceData.Length - 3]; else { dr[j] = DeviceData[j - 2]; if (DeviceData[j - 2] != "") { try { if ((Convert.ToDouble(DeviceData[j - 2]) < Convert.ToDouble(LowLimit[j]) || Convert.ToDouble(DeviceData[j - 2]) > Convert.ToDouble(HighLimit[j]))) { PassStatus = false; } } catch(Exception ex) { //throw new Exception("Device ID: " + i.ToString() + "\r\n" + ex.Message); dr[j] = Convert.ToString(-99); PassStatus = false; } } } } if (PassStatus) { dr[DataParseResult.Columns.Count - 1] = "Pass"; //m_PassedDevice++; } else { dr[DataParseResult.Columns.Count - 1] = "Fail"; //m_FailedDevice++; } DataParseResult.Rows.Add(dr); } //Timer session ts = DateTime.Now - dtStart; InsertTime = ts.TotalMilliseconds; } catch (Exception ex) { throw new Exception("Insert into datatable error \n " + ex.Message); } #endregion Parse string into datatable } DataParseResult.PrimaryKey = new DataColumn[] { DataParseResult.Columns[0] }; return DataParseResult; }//end of GetDataFromTxt