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); } } } }