Esempio n. 1
0
        } //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);
            }
        }
Esempio n. 2
0
        /// <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);
            }
        }
Esempio n. 3
0
        ///<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
Esempio n. 4
0
        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 ***
        }
Esempio n. 5
0
        ///<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;

        }
Esempio n. 6
0
        ///<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
Esempio n. 7
0
        ///<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");
        }
Esempio n. 8
0
        ///<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");
        }
Esempio n. 9
0
        ///<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;
        }
Esempio n. 10
0
        }//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");
        }
Esempio n. 11
0
        ///<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