You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
342 lines
17 KiB
342 lines
17 KiB
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<string> 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<int, Dictionary<int, string>> keyValuePairs = new Dictionary<int, Dictionary<int, string>>(); |
|
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<int, string> keyValues = new Dictionary<int, string>() { { i, lines[i].ToString() } }; |
|
keyValuePairs.Add(startstr, keyValues); |
|
} |
|
} |
|
|
|
//检查是否合法 |
|
Dictionary<int, string> keyValueError = new Dictionary<int, string>(); |
|
foreach (var item in keyValuePairs) |
|
{ |
|
Dictionary<int, string> 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<string> values = new List<string>(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<string> listPoints = new List<string>(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<string> 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<string> 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<int, Dictionary<int, string>> keyValuePairs = new Dictionary<int, Dictionary<int, string>>(); |
|
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<int, string> keyValues = new Dictionary<int, string>() { { i, lines[i].ToString() } }; |
|
keyValuePairs.Add(startstr, keyValues); |
|
} |
|
} |
|
|
|
//检查是否合法 |
|
Dictionary<int, string> keyValueError = new Dictionary<int, string>(); |
|
foreach (var item in keyValuePairs) |
|
{ |
|
Dictionary<int, string> 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<string> GetTableVCTErrorID(string tablePath) |
|
{ |
|
List<string> errorID = new List<string>(); |
|
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 |
|
{ |
|
|
|
} |
|
|
|
}
|
|
|