using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data; using System.IO; namespace mainProgram { class SpectralProcessor { public void OpenNolinerData() { } public void OpenCalData() { } public void NonLinearCorrection(double[] coefficient, double[] rawData,int bandnumber) { for (int i = 0; i < bandnumber; i++) { rawData[i] = rawData[i] / (coefficient[0] + coefficient[1] * rawData[i] + coefficient[2] * Math.Pow(rawData[i], 2) + coefficient[3] * Math.Pow(rawData[i], 3) + coefficient[4] * Math.Pow(rawData[i], 4) + coefficient[5] * Math.Pow(rawData[i], 5) + coefficient[6] * Math.Pow(rawData[i], 6) + coefficient[7] * Math.Pow(rawData[i], 7) ); } } public void RadCorrection(double[] calData, int i1,double[] rawData, int i2, int bandnumber) { for (int i = 0; i < bandnumber; i++) { rawData[i] = rawData[i] * calData[i] * (i1 * 1.0) / (i2 * 1.0); } } } public class SpectralDataReaderWriter { public SpectralDataReaderWriter(string csvPath) { mCsvPath = csvPath; OpenCSV(); GetMetaData(); } private string mCsvPath; public DataTable mDataTable = null; private int mTotalSpectrometer; private int mSpectralCount; public int findMaxColunmCount(string filePath) { Encoding encoding = GetType(filePath); //Encoding.ASCII;// DataTable dt = new DataTable(); FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read); StreamReader sr = new StreamReader(fs, encoding); string strLine = ""; string[] aryLine = null; int maxColunmCount = 0; int tmp; while ((strLine = sr.ReadLine()) != null) { aryLine = strLine.Split(','); tmp = aryLine.Length; if (maxColunmCount < tmp) { maxColunmCount = tmp; } } sr.Close(); fs.Close(); return maxColunmCount; } //https://www.jb51.net/article/193012.htm public void OpenCSV()//从csv读取数据返回table { mDataTable = new DataTable(); int columnCount1 = findMaxColunmCount(mCsvPath); for (int i = 0; i < columnCount1; i++) { DataColumn dc1 = new DataColumn(); mDataTable.Columns.Add(dc1); } Encoding encoding = GetType(mCsvPath); //Encoding.ASCII;// FileStream fs = new FileStream(mCsvPath, FileMode.Open, FileAccess.Read); StreamReader sr = new StreamReader(fs, encoding); //记录每次读取的一行记录 string strLine = ""; //记录每行记录中的各字段内容 string[] aryLine = null; //逐行读取CSV中的数据 while ((strLine = sr.ReadLine()) != null) { aryLine = strLine.Split(','); DataRow dr = mDataTable.NewRow(); for (int j = 0; j < aryLine.Length; j++) { dr[j] = aryLine[j]; } mDataTable.Rows.Add(dr); } sr.Close(); fs.Close(); } public void GetMetaData() { mTotalSpectrometer = int.Parse(mDataTable.Rows[1][1].ToString()); mSpectralCount = mDataTable.Rows.Count - 3 - mTotalSpectrometer * 2; } public void SaveCSV(DataTable dt, string fullPath)//table数据写入csv { FileInfo fi = new FileInfo(fullPath); if (!fi.Directory.Exists) { fi.Directory.Create(); } FileStream fs = new FileStream(fullPath, FileMode.Create, FileAccess.Write); StreamWriter sw = new StreamWriter(fs, Encoding.UTF8); string data = ""; for (int i = 0; i < dt.Columns.Count; i++)//写入列名 { data += dt.Columns[i].ColumnName.ToString(); if (i < dt.Columns.Count - 1) { data += ","; } } sw.WriteLine(data); for (int i = 0; i < dt.Rows.Count; i++) //写入各行数据 { data = ""; for (int j = 0; j < dt.Columns.Count; j++) { string str = dt.Rows[i][j].ToString(); str = str.Replace("\"", "\"\"");//替换英文冒号 英文冒号需要换成两个冒号 if (str.Contains(',') || str.Contains('"') || str.Contains('\r') || str.Contains('\n')) //含逗号 冒号 换行符的需要放到引号中 { str = string.Format("\"{0}\"", str); } data += str; if (j < dt.Columns.Count - 1) { data += ","; } } sw.WriteLine(data); } sw.Close(); fs.Close(); } // 给定文件的路径,读取文件的二进制数据,判断文件的编码类型 public Encoding GetType(string FILE_NAME) { FileStream fs = new FileStream(FILE_NAME, FileMode.Open, FileAccess.Read); Encoding r = GetType(fs); fs.Close(); return r; } // 通过给定的文件流,判断文件的编码类型 public Encoding GetType(FileStream fs) { byte[] Unicode = new byte[] { 0xFF, 0xFE, 0x41 }; byte[] UnicodeBIG = new byte[] { 0xFE, 0xFF, 0x00 }; byte[] UTF8 = new byte[] { 0xEF, 0xBB, 0xBF }; //带BOM Encoding reVal = Encoding.Default; BinaryReader r = new BinaryReader(fs, Encoding.Default); int i; int.TryParse(fs.Length.ToString(), out i); byte[] ss = r.ReadBytes(i); if (IsUTF8Bytes(ss) || (ss[0] == 0xEF && ss[1] == 0xBB && ss[2] == 0xBF)) { reVal = Encoding.UTF8; } else if (ss[0] == 0xFE && ss[1] == 0xFF && ss[2] == 0x00) { reVal = Encoding.BigEndianUnicode; } else if (ss[0] == 0xFF && ss[1] == 0xFE && ss[2] == 0x41) { reVal = Encoding.Unicode; } r.Close(); return reVal; } // 判断是否是不带 BOM 的 UTF8 格式 private bool IsUTF8Bytes(byte[] data) { int charByteCounter = 1; //计算当前正分析的字符应还有的字节数 byte curByte; //当前分析的字节. for (int i = 0; i < data.Length; i++) { curByte = data[i]; if (charByteCounter == 1) { if (curByte >= 0x80) { //判断当前 while (((curByte <<= 1) & 0x80) != 0) { charByteCounter++; } //标记位首位若为非0 则至少以2个1开始 如:110XXXXX...........1111110X  if (charByteCounter == 1 || charByteCounter > 6) { return false; } } } else { //若是UTF-8 此时第一位必须为1 if ((curByte & 0xC0) != 0x80) { return false; } charByteCounter--; } } if (charByteCounter > 1) { throw new Exception("非预期的byte格式"); } return true; } public bool ChangeFileName(string OldPath, string NewPath) { bool re = false; try { if (File.Exists(OldPath)) { File.Move(OldPath, NewPath); re = true; } } catch { re = false; } return re; } public bool SaveCSV(string fullPath, string Data) { bool re = true; try { FileStream FileStream = new FileStream(fullPath, FileMode.Append); StreamWriter sw = new StreamWriter(FileStream, Encoding.UTF8); sw.WriteLine(Data); //清空缓冲区 sw.Flush(); //关闭流 sw.Close(); FileStream.Close(); } catch { re = false; } return re; } }; }