using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using KGIS.Framework.Utils; using System.IO; using UIShell.OSGi.Utility; using System.Collections; using DevExpress.Mvvm.Native; using NPOI.SS.Formula.Functions; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; namespace Kingo.PluginServiceInterface.Helper { public static class DealVCTErrorFileHelper { public static bool CheckAndDeleteVCTError(string directoryPath, string xzqdm) { try { if (string.IsNullOrEmpty(directoryPath) || !Directory.Exists(directoryPath)) return false; if (string.IsNullOrEmpty(xzqdm)) return false; DirectoryInfo dir = new DirectoryInfo(directoryPath); FileInfo[] fileSet = dir.GetFiles("*.VCT", SearchOption.TopDirectoryOnly); if (fileSet == null || fileSet.Length == 0) { LogAPI.Debug("所选择的更新数据包\\标准格式数据文件夹下不存在vct文件!"); //MessageHelper.Show("所选择的更新数据包\\标准格式数据文件夹下不存在vct文件!"); return false; } foreach (FileInfo file in fileSet) { string strjson1 = File.ReadAllText(file.FullName, Encoding.Default); List lines = strjson1.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).ToList(); int startIndex = lines.IndexOf("PolygonBegin"); int endIndex = lines.IndexOf("PolygonEnd"); if (startIndex != -1 && endIndex != -1) { Dictionary> keyValuePairs = new Dictionary>(); int startstr = lines[startIndex + 1].ToInt(); for (int i = startIndex + 1; i < endIndex; i++) { if ((startstr + 1).ToString() == lines[i].ToString() || ("unknown" == lines[i + 2].ToString())) { if ((startstr + 1).ToString() == lines[i].ToString()) startstr = startstr + 1; else if ("unknown" == lines[i + 2].ToString()) startstr = lines[i].ToInt(); } if (keyValuePairs.ContainsKey(startstr)) { keyValuePairs[startstr].Add(i, lines[i].ToString()); } else { Dictionary keyValues = new Dictionary() { { i, lines[i].ToString() } }; keyValuePairs.Add(startstr, keyValues); } } //检查是否合法 Dictionary keyValueError = new Dictionary(); foreach (var item in keyValuePairs) { Dictionary valuePairs = item.Value; int begin = valuePairs.FirstOrDefault().Key; int end = valuePairs.LastOrDefault().Key; if (valuePairs[end] != "0") { keyValueError.Add(valuePairs.FirstOrDefault().Key, valuePairs.FirstOrDefault().Value); continue; } List values = new List(valuePairs.Values); if (!values.Contains("21")) { keyValueError.Add(valuePairs.FirstOrDefault().Key, valuePairs.FirstOrDefault().Value); continue; } int index = values.FindIndex(x => x == "21"); int pointCount = values[index + 1].ToInt(); if (pointCount < 1) { keyValueError.Add(valuePairs.FirstOrDefault().Key, valuePairs.FirstOrDefault().Value); continue; } if (values.Count - 1 < index + 2 || values.Count - 1 == index + 2) { keyValueError.Add(valuePairs.FirstOrDefault().Key, valuePairs.FirstOrDefault().Value); continue; } string point = ""; for (int k = index + 2; k < values.Count - 1; k++) { if (k < values.Count - 2) point += values[k] + ","; else point += values[k]; } if (string.IsNullOrEmpty(point) || point.StartsWith("0,") || point.EndsWith(",0")) { keyValueError.Add(valuePairs.FirstOrDefault().Key, valuePairs.FirstOrDefault().Value); continue; } List listPoints = new List(point.Split(',')); if (listPoints.Count != pointCount) { keyValueError.Add(valuePairs.FirstOrDefault().Key, valuePairs.FirstOrDefault().Value); continue; } } //检查结果倒序删除 if (keyValueError.Count > 0) { var sortedDictionary = keyValueError.OrderByDescending(kvp => kvp.Key).ToDictionary(kvp => kvp.Key, kvp => kvp.Value); foreach (var pair in sortedDictionary) { int attributeIndex = lines.IndexOf(x => x.StartsWith(pair.Value + "," + xzqdm)); if (attributeIndex == -1)//标识码为空的情况 { attributeIndex = lines.IndexOf(x => x.StartsWith(pair.Value + ",,")); } if (attributeIndex > -1) { lines.RemoveAt(attributeIndex); var needDelete = keyValuePairs.FirstOrDefault(x => x.Key == pair.Value.ToInt()); foreach (var item in needDelete.Value.OrderByDescending(kvp => kvp.Key)) { lines.RemoveAt(item.Key); } } } } //lines1.RemoveAt(1); File.WriteAllLines(file.FullName, lines, Encoding.GetEncoding("gb2312")); } else { Console.WriteLine("Polygon data not found."); } } return true; } catch (Exception ex) { LogAPI.Debug("VCT前置错误检查处理 发生异常:" + ex.Message); LogAPI.Debug("VCT前置错误检查处理 发生异常:" + ex.StackTrace); return false; } } public static bool CheckAndDeleteVCTErrorByTable(string directoryPath, string xzqdm, string tablePath) { try { if (string.IsNullOrEmpty(directoryPath) || !Directory.Exists(directoryPath)) return false; if (string.IsNullOrEmpty(xzqdm)) return false; if (string.IsNullOrEmpty(tablePath) || !File.Exists(tablePath)) return false; DirectoryInfo dir = new DirectoryInfo(directoryPath); FileInfo[] fileSet = dir.GetFiles("*.VCT", SearchOption.TopDirectoryOnly); if (fileSet == null || fileSet.Length == 0) { LogAPI.Debug("所选择的更新数据包\\标准格式数据文件夹下不存在vct文件!"); //MessageHelper.Show("所选择的更新数据包\\标准格式数据文件夹下不存在vct文件!"); return false; } List errorID = GetTableVCTErrorID(tablePath); if (errorID == null || errorID.Count == 0) { LogAPI.Debug("所选择的更新数据包\\标准格式数据文件夹下不存在所选择表格中的VCT错误信息,无需修改!"); return true; } foreach (FileInfo file in fileSet) { string strjson1 = File.ReadAllText(file.FullName, Encoding.Default); if (string.IsNullOrEmpty(strjson1)) { LogAPI.Debug($"所选择的{file.FullName}文件为空!"); continue; } List lines = strjson1.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).ToList(); int startIndex = lines.IndexOf("PolygonBegin"); int endIndex = lines.IndexOf("PolygonEnd"); if (startIndex != -1 && endIndex != -1) { Dictionary> keyValuePairs = new Dictionary>(); int startstr = lines[startIndex + 1].ToInt(); for (int i = startIndex + 1; i < endIndex; i++) { if ((startstr + 1).ToString() == lines[i].ToString() || ("unknown" == lines[i + 2].ToString())) { if ((startstr + 1).ToString() == lines[i].ToString()) startstr = startstr + 1; else if ("unknown" == lines[i + 2].ToString()) startstr = lines[i].ToInt(); } if (keyValuePairs.ContainsKey(startstr)) { keyValuePairs[startstr].Add(i, lines[i].ToString()); } else { Dictionary keyValues = new Dictionary() { { i, lines[i].ToString() } }; keyValuePairs.Add(startstr, keyValues); } } //检查是否合法 Dictionary keyValueError = new Dictionary(); foreach (var item in keyValuePairs) { Dictionary valuePairs = item.Value; int begin = valuePairs.FirstOrDefault().Key; int end = valuePairs.LastOrDefault().Key; if (errorID.Contains(valuePairs[begin])) { keyValueError.Add(valuePairs.FirstOrDefault().Key, valuePairs.FirstOrDefault().Value); continue; } } //检查结果倒序删除 if (keyValueError.Count > 0) { var sortedDictionary = keyValueError.OrderByDescending(kvp => kvp.Key).ToDictionary(kvp => kvp.Key, kvp => kvp.Value); foreach (var pair in sortedDictionary) { int attributeIndex = lines.IndexOf(x => x.StartsWith(pair.Value + "," + xzqdm)); if (attributeIndex == -1)//标识码为空的情况 { attributeIndex = lines.IndexOf(x => x.StartsWith(pair.Value + ",,")); } if (attributeIndex > -1) { lines.RemoveAt(attributeIndex); var needDelete = keyValuePairs.FirstOrDefault(x => x.Key == pair.Value.ToInt()); foreach (var item in needDelete.Value.OrderByDescending(kvp => kvp.Key)) { lines.RemoveAt(item.Key); } } } } //lines1.RemoveAt(1); File.WriteAllLines(file.FullName, lines, Encoding.GetEncoding("gb2312")); } else { Console.WriteLine("Polygon data not found."); } } return true; } catch (Exception ex) { LogAPI.Debug("VCT前置错误检查处理 发生异常:" + ex.Message); LogAPI.Debug("VCT前置错误检查处理 发生异常:" + ex.StackTrace); return false; } } private static List GetTableVCTErrorID(string tablePath) { List errorID = new List(); try { try { using (FileStream fileStream = new FileStream(tablePath, FileMode.Open, FileAccess.Read)) { } } catch { LogAPI.Debug("所选表格被占用!"); return errorID; } using (FileStream fileStream = new FileStream(tablePath, FileMode.Open, FileAccess.Read)) { IWorkbook workbook = new XSSFWorkbook(fileStream); ISheet sheet = workbook.GetSheetAt(0); for (int rowIndex = 1; rowIndex <= sheet.LastRowNum; rowIndex++) { IRow inputRow = sheet.GetRow(rowIndex); if (inputRow == null) continue; ICell inputCell = inputRow.GetCell(3); if (inputCell == null || string.IsNullOrEmpty(inputCell.ToString())) continue; if (inputCell.ToString().StartsWith("VCT文件")) { var split = inputCell.ToString().Split(':'); if (split == null || split.Length < 1) continue; foreach (var item in split) { if (item.Contains("请检查标识码为")) { string tempId = item.Replace("请检查标识码为", ""); bool isNum = int.TryParse(tempId, out int id); if (isNum) { errorID.Add(id.ToString()); break; } } else { bool isNum = int.TryParse(item, out int id); if (isNum) { errorID.Add(id.ToString()); break; } } } } } } return errorID; } catch (Exception ex) { LogAPI.Debug("获取表格中错误ID 发生异常:" + ex.Message); LogAPI.Debug("获取表格中错误ID 发生异常:" + ex.StackTrace); return errorID; } } } public class VCTPolygonMessage { } }