结构化读取csv中的光谱数据

This commit is contained in:
2021-12-16 18:40:51 +08:00
parent c0aaf7a897
commit f7306314d5
10 changed files with 442 additions and 37 deletions

View File

@ -7,6 +7,7 @@ using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows.Forms; using System.Windows.Forms;
using System.IO;
namespace mainProgram namespace mainProgram
{ {
@ -45,6 +46,55 @@ namespace mainProgram
private void RadToolStripMenuItem_Click(object sender, EventArgs e) private void RadToolStripMenuItem_Click(object sender, EventArgs e)
{ {
SpectralDataReaderWriter xx = new SpectralDataReaderWriter(@"D:\Desktop\0easySifProject\1raw\2021_12_16\beijing_17_57_44.csv");
string name = xx.mDataTable.Rows[16][0].ToString();
int i = 0;
//mProjectManager.
//string[] sourceFilesPath = Directory.GetFileSystemEntries(sourceFolderName);
//for (int i = 0; i < sourceFilesPath.Length; i++)
//{
// string sourceFilePath = (sourceFilesPath[i]).Replace("\\", "/");
// string[] forlders = sourceFilePath.Split('/');
// if (File.Exists(sourceFilePath))
// {
// string dest = destFolderName;
// string sourceFileName = Path.GetFileName(sourceFilePath);
// File.Copy(sourceFilePath, Path.Combine(dest, sourceFileName), overwrite);
// }
// else if (Directory.Exists(sourceFilePath))
// {
// string lastDirectory = forlders[forlders.Length - 1];
// string dest = Path.Combine(destFolderName, lastDirectory).Replace("\\", "/");
// if (!Directory.Exists(dest))
// {
// Directory.CreateDirectory(dest);
// }
// CopySubFun(sourceFilePath, dest, overwrite);
// }
//}
} }
} }

View File

@ -37,7 +37,6 @@ namespace mainProgram
MessageBox.Show(this, "数据文件夹路径不能为空", "提示"); MessageBox.Show(this, "数据文件夹路径不能为空", "提示");
return; return;
} }
if (projectPath != null && projectPath.Length == 0) if (projectPath != null && projectPath.Length == 0)
{ {
MessageBox.Show(this, "工程路径不能为空", "提示"); MessageBox.Show(this, "工程路径不能为空", "提示");
@ -45,30 +44,11 @@ namespace mainProgram
} }
ProjectManager projectManager = new ProjectManager(projectPath); ProjectManager projectManager = new ProjectManager(projectPath);
projectManager.CreateProject(dataPath);
projectManager.CreateProjectStructure();
projectManager.CopyFileToFile(dataPath);//复制原始数据文件到工程结构对应文件夹
//ProjectManager xx = new ProjectManager();
////xml文件存储路径
//string myXMLFilePath = "D:\\csharp_vs2017\\easySif\\MyComputers.xml";
////生成xml文件
//xx.GenerateXMLFile(myXMLFilePath);
////遍历xml文件的信息
//xx.GetXMLInformation(myXMLFilePath);
////修改xml文件的信息
//xx.ModifyXmlInformation(myXMLFilePath);
////向xml文件添加节点信息
//xx.AddXmlInformation(myXMLFilePath);
////删除指定节点信息
//xx.DeleteXmlInformation(myXMLFilePath);
TransferEvent(projectManager);//触发事件 TransferEvent(projectManager);//触发事件
MessageBox.Show(this, "工程创建成功!", "提示");
Close();//创建工程完成后,关闭窗口 Close();//创建工程完成后,关闭窗口
} }

View File

@ -19,7 +19,19 @@ namespace mainProgram
private void SelectProjectPathBtn_Click(object sender, EventArgs e) private void SelectProjectPathBtn_Click(object sender, EventArgs e)
{ {
FolderBrowserDialog dialog = new FolderBrowserDialog();
dialog.Description = "请选择工程文件夹";
if (dialog.ShowDialog() == DialogResult.OK)
{
if (string.IsNullOrEmpty(dialog.SelectedPath))
{
MessageBox.Show(this, "文件夹路径不能为空", "提示");
return;
}
string savePath = dialog.SelectedPath;
ProjectPathTextBox.Text = savePath;
}
} }
private void OpenProjectPathBtn_Click(object sender, EventArgs e) private void OpenProjectPathBtn_Click(object sender, EventArgs e)

View File

@ -16,6 +16,7 @@ namespace mainProgram
} }
private string mProjectPath; private string mProjectPath;
private string mMetadataPath;
private string mRawPath; private string mRawPath;
private string mRadPath; private string mRadPath;
private string mSifPath; private string mSifPath;
@ -32,12 +33,31 @@ namespace mainProgram
} }
} }
public void CreateProject() public void CreateProject(string dataPath)
{ {
//if (mProjectPath.Length==0) if (mProjectPath.Length == 0)
//{ {
// return; return;
//} }
DelectDir(mProjectPath);//删除工程路径下的所有内容
CreateProjectStructure();
CopyFileToFile(dataPath);//复制原始数据文件到工程结构对应文件夹
////创建工程元数据
//string myXMLFilePath = mMetadataPath + "/metadata.xml";
////生成xml文件
//GenerateXMLFile(myXMLFilePath);
////遍历xml文件的信息
//GetXMLInformation(myXMLFilePath);
////修改xml文件的信息
//ModifyXmlInformation(myXMLFilePath);
////向xml文件添加节点信息
//AddXmlInformation(myXMLFilePath);
////删除指定节点信息
//DeleteXmlInformation(myXMLFilePath);
} }
public void OpenProject() public void OpenProject()
@ -254,19 +274,19 @@ namespace mainProgram
for (int i = 0; i < sourceFilesPath.Length; i++) for (int i = 0; i < sourceFilesPath.Length; i++)
{ {
string sourceFilePath = (sourceFilesPath[i]).Replace("\\", "/"); string sourceFilePath = sourceFilesPath[i];
string[] forlders = sourceFilePath.Split('/'); string[] forlders = sourceFilePath.Split('\\');
if (File.Exists(sourceFilePath))//是文件,直接拷贝 if (File.Exists(sourceFilePath))//是文件,直接拷贝
{ {
string dest = destFolderName; string dest = destFolderName;
string sourceFileName = Path.GetFileName(sourceFilePath); string sourceFileName = Path.GetFileName(sourceFilePath);//获取文件名
File.Copy(sourceFilePath, Path.Combine(dest, sourceFileName), overwrite); File.Copy(sourceFilePath, Path.Combine(dest, sourceFileName), overwrite);
} }
else if (Directory.Exists(sourceFilePath))//是文件夹,拷贝文件夹;并递归 else if (Directory.Exists(sourceFilePath))//是文件夹,拷贝文件夹;并递归
{ {
string lastDirectory = forlders[forlders.Length - 1]; string lastDirectory = forlders[forlders.Length - 1];
string dest = Path.Combine(destFolderName, lastDirectory).Replace("\\", "/"); string dest = Path.Combine(destFolderName, lastDirectory);
if (!Directory.Exists(dest)) if (!Directory.Exists(dest))
{ {
@ -279,7 +299,6 @@ namespace mainProgram
private void DelectDir(string srcPath) private void DelectDir(string srcPath)
{ {
DirectoryInfo dir = new DirectoryInfo(srcPath); DirectoryInfo dir = new DirectoryInfo(srcPath);
FileSystemInfo[] fileinfo = dir.GetFileSystemInfos(); //返回目录中所有文件和子目录 FileSystemInfo[] fileinfo = dir.GetFileSystemInfos(); //返回目录中所有文件和子目录
foreach (FileSystemInfo i in fileinfo) foreach (FileSystemInfo i in fileinfo)
@ -302,9 +321,20 @@ namespace mainProgram
public void CreateProjectStructure() public void CreateProjectStructure()
{ {
//创建工程文件夹结构 //创建工程文件夹结构
mRawPath = mProjectPath + "/raw/"; //mMetadataPath = mProjectPath + "\\.project\\";
mRadPath = mProjectPath + "/rad/"; //mRawPath = mProjectPath + "\\1raw\\";
mSifPath = mProjectPath + "/sif/"; //mRadPath = mProjectPath + "\\2rad\\";
//mSifPath = mProjectPath + "\\3sif\\";
mMetadataPath = Path.Combine(mProjectPath, ".project");
mRawPath = Path.Combine(mProjectPath, "1raw");
mRadPath = Path.Combine(mProjectPath, "2rad");
mSifPath = Path.Combine(mProjectPath, "3sif");
if (false == Directory.Exists(mMetadataPath))
{
Directory.CreateDirectory(mMetadataPath);
}
if (false == Directory.Exists(mRawPath)) if (false == Directory.Exists(mRawPath))
{ {
Directory.CreateDirectory(mRawPath); Directory.CreateDirectory(mRawPath);
@ -318,5 +348,37 @@ namespace mainProgram
Directory.CreateDirectory(mSifPath); Directory.CreateDirectory(mSifPath);
} }
} }
//处理工程中的数据
public void Rad()
{
//string[] sourceFilesPath = Directory.GetFileSystemEntries(sourceFolderName);
//for (int i = 0; i < sourceFilesPath.Length; i++)
//{
// string sourceFilePath = sourceFilesPath[i];
// string[] forlders = sourceFilePath.Split('\\');
// if (File.Exists(sourceFilePath))//是文件,直接拷贝
// {
// string dest = destFolderName;
// string sourceFileName = Path.GetFileName(sourceFilePath);//获取文件名
// File.Copy(sourceFilePath, Path.Combine(dest, sourceFileName), overwrite);
// }
// else if (Directory.Exists(sourceFilePath))//是文件夹,拷贝文件夹;并递归
// {
// string lastDirectory = forlders[forlders.Length - 1];
// string dest = Path.Combine(destFolderName, lastDirectory);
// if (!Directory.Exists(dest))
// {
// Directory.CreateDirectory(dest);
// }
// CopySubFun(sourceFilePath, dest, overwrite);
// }
//}
}
} }
} }

View File

@ -3,10 +3,311 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Data;
using System.IO;
namespace mainProgram namespace mainProgram
{ {
class SpectralProcessor 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;
}
};
} }