using System;
using System.IO;
using System.Collections.Generic;
using Aurora.Api;
using System.Threading.Tasks;
namespace VisionCommon {
///
/// 데이터 저장 타입
///
public enum eSaveDataType {
Align,
AttachInsp,
PatternDistance,
Pattern,
BCR,
Calibration,
VisionRepeat,
CenterTuning,
AutoFocus,
}
///
/// CSV 로드 및 저장
///
public class CsvManager {
private Logger _Logger = new Logger("CsvManager");
///
/// 생성자
///
public CsvManager() {
}
///
/// CSV파일 로드
///
/// 서브시스템 정보
/// 시간
/// 데이터 저장 타입
/// 데이터 리스트
public List LoadCsv(SubSysInfo subSysInfo, DateTime dateTime, eSaveDataType saveDataType) where T : class {
List subDirNames = CsvPathManager.Instance.GetSubDirNames(subSysInfo, dateTime);
string dirPath = CsvPathManager.Instance.GetDirPath(subDirNames);
string fileName = CsvPathManager.Instance.GetFileNameWithDate(subSysInfo.SubSysName, dateTime);
string filePath = dirPath + "\\" + fileName + "_" + saveDataType.ToString() + ".csv";
if (!File.Exists(filePath)) {
//_Logger.FuncE($"filePath[{filePath}] exists not.");
return null;
}
try {
string[] lines = File.ReadAllLines(filePath);
if (lines.Length < 2) {
return null;
}
List resultList = new List();
string[] headerItems = lines[0].Split(',');
for (int i = 1; i < lines.Length; i++) {
string[] dataList = lines[i].Split(',');
if (dataList.Length != headerItems.Length) {
continue;
}
object item = Activator.CreateInstance(typeof(T));
for (int j = 0; j < headerItems.Length; j++) {
System.Reflection.PropertyInfo property = item.GetType().GetProperty(headerItems[j]);
if (property.CanWrite) {
object val;
if (string.IsNullOrEmpty(dataList[j])) {
val = property.PropertyType.IsValueType ? Activator.CreateInstance(property.PropertyType) : null;
}
else {
val = Convert.ChangeType(dataList[j], property.PropertyType);
}
property.SetValue(item, val);
}
}
resultList.Add((T)item);
}
return resultList;
}
catch (Exception e) {
_Logger.FuncE(e.Message);
}
return null;
}
///
/// 자동 생성된 경로에 CSV파일 저장 (비동기식)
///
/// 서브시스템 정보
/// 데이터 리스트
/// 데이터 저장 타입
public void SaveCsv(SubSysInfo subSysInfo, List dataList, eSaveDataType saveDataType) {
try {
Task.Run(() => {
SaveCsvInternal(subSysInfo, dataList, saveDataType);
});
}
catch (Exception e) {
_Logger.FuncE(e.Message);
}
}
///
/// 자동 생성된 경로에 CSV파일 저장 (비동기식)
///
/// 서브시스템 정보
/// 데이터
/// 데이터 저장 타입
public void SaveCsv(SubSysInfo subSysInfo, T data, eSaveDataType saveDataType) {
try {
Task.Run(() => {
List dataList = new List();
dataList.Add(data);
SaveCsvInternal(subSysInfo, dataList, saveDataType);
});
}
catch (Exception e) {
_Logger.FuncE(e.Message);
}
}
///
/// 자동 생성된 경로에 CSV파일 저장 (동기식)
///
/// 서브시스템 정보
/// 데이터
/// 데이터 저장 타입
public void SaveCsvSync(SubSysInfo subSysInfo, T data, eSaveDataType saveDataType) {
try {
List dataList = new List();
dataList.Add(data);
SaveCsvInternal(subSysInfo, dataList, saveDataType);
}
catch (Exception e) {
_Logger.FuncE(e.Message);
}
}
private void SaveCsvInternal(
SubSysInfo subSysInfo, List dataList, eSaveDataType saveDataType, bool useHeader = true) {
try {
if (dataList == null || dataList.Count == 0) {
_Logger.FuncE($"dataList is null or zero.");
return;
}
FileStream fileStream;
StreamWriter streamWriter;
bool isheadWrited;
List subDirNames = CsvPathManager.Instance.GetSubDirNames(subSysInfo);
string dirPath = CsvPathManager.Instance.GetDirPath(subDirNames);
//string fileName = CsvPathManager.Instance.GetFileNameWithDateTime(vsRps.SubSysName.ToString());
string fileName = CsvPathManager.Instance.GetFileNameWithDate(subSysInfo.SubSysName);
string filePath = dirPath + "\\" + fileName + "_" + saveDataType.ToString() + ".csv";
if (!File.Exists(filePath)) {
if (!Directory.Exists(dirPath)) {
Directory.CreateDirectory(dirPath);
}
fileStream = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite);
streamWriter = new StreamWriter(fileStream);
streamWriter.AutoFlush = true;
isheadWrited = false;
}
else {
fileStream = new FileStream(filePath, FileMode.Append, FileAccess.Write, FileShare.ReadWrite);
streamWriter = new StreamWriter(fileStream);
streamWriter.AutoFlush = true;
isheadWrited = true;
}
if (!isheadWrited) {
if (useHeader == true) {
string header = string.Empty;
foreach (var propertyInfo in dataList[0].GetType().GetProperties()) {
header += propertyInfo.Name + ",";
}
header = header.TrimEnd(',');
streamWriter.WriteLine(header);
}
}
foreach (var item in dataList) {
string itemLine = string.Empty;
foreach (var propertyInfo in item.GetType().GetProperties()) {
//itemLine += propertyInfo.GetValue(item)?.ToString() ?? "" + ",";
itemLine += propertyInfo.GetValue(item)?.ToString() + ","; // 0823 CSV파일 라인에 쉼표가 안찍히는 현상으로 인한 수정
}
itemLine = itemLine.TrimEnd(',');
streamWriter.WriteLine(itemLine);
}
streamWriter.Close();
fileStream.Close();
}
catch (Exception e) {
_Logger.FuncE(e.Message);
}
}
}
}