private static void CreateColumnMap(string sheetPath) { string assetPath = "Assets/Scripts/DataObjects"; if (!string.IsNullOrEmpty(sheetPath)) { if (!File.Exists(sheetPath)) { Debug.LogWarning(string.Format("Sheet Path {0} does not exist.", sheetPath)); return; } ExcelQuery q = new ExcelQuery(sheetPath); q.GetNewSheet(q.GetSheetNames()[0]); string err = string.Empty; string[] titles = q.GetTitle(0, ref err); if (err != string.Empty) { Debug.LogError(string.Format("Could not read sheet titles from first sheet {0} of {1}", q.GetSheetNames()[0], sheetPath)); return; } else { var bar = ScriptableObjectUtils.ObservableCreateAsset <ColumnMap>(Path.GetFileNameWithoutExtension(sheetPath) + "_ColumnMap", assetPath) .Do(map => { ScriptableObjectUtils.ObservableCreateAsset <RuleConstant>("WriteNothing", assetPath) .Subscribe(defaultRule => { int len = titles.Length; for (int i = 0; i < len; i++) { map.rules.Add(new RuleInfo() { description = string.Format("{0} - {1}", SheetUtils.GetColumnLettersFromIndex(i + 1), titles[i]), rule = defaultRule }); } }); map.header.AddRange(titles); }); bar.Subscribe(); } } }
private static string[][] ImportSheet(ExcelQuery q, ColumnMap map, int aluIndex, int upcIndex, ItemList itemList) { HashSet <string> seenALUs = new HashSet <string>(); HashSet <string> seenUPCs = new HashSet <string>(); InventoryItem item; Debug.Log("Import sheet"); q.GetNewSheet(q.GetSheetNames()[0]); string err = string.Empty; string[] titles = q.GetTitle(0, ref err); if (titles == null && err != string.Empty) { Debug.LogError(string.Format("Could not read sheet titles from first sheet {0} - err msg: {1}", q.GetSheetNames()[0], err)); return(null); } //NO--This is all wrong. Should be checking that the map matches the itemlist when it is imported //if (titles.Length != map.header.Count) //{ // Debug.LogError(string.Format("Map heading count does not match imported sheet")); // return null; //} //int index = 0; //foreach (string heading in titles) //{ // if (!heading.Equals(map.header[index], StringComparison.OrdinalIgnoreCase)) // { // Debug.LogError(string.Format("Map heading {0} does not match heading ({1})in imported sheet at index {2}", map.header[index], heading, index)); // return null; // } // index++; //} int rows = q.NumOfRows(); int cols = map.header.Count; int titleRow = q.TitleRow; int len = q.GetLongestRowLength(); List <string[]> temp2 = new List <string[]>(); string[] inputVals; List <string> row = new List <string>(); for (int x = titleRow + 1; x < rows - titleRow; x++) { inputVals = q.GetRow <string>(x, string.Empty, len); if (inputVals == null) { continue; } string alu = map.rules[aluIndex].rule.Process(inputVals); string upc = map.rules[upcIndex].rule.Process(inputVals); item = itemList.GetALU(alu); if (item != null && item.DefaultUnitIsCase) { inputVals[map.UOM.Index.GetVal()] = map.CaseVal.GetVal(); } //if importOnce is set, skip any we've already seens if (!map.importOnce || (!seenALUs.Contains(alu)) && (!seenUPCs.Contains(upc))) { row.Clear(); for (int y = 0; y < cols; y++) { row.Add(map.rules[y].rule.Process(inputVals)); } if (!string.IsNullOrEmpty(alu)) { seenALUs.Add(row[aluIndex]); } else { Debug.LogError(string.Format("No ALU found for row {0}", x)); continue; } if (!string.IsNullOrEmpty(upc)) { seenUPCs.Add(row[upcIndex]); } temp2.Add(row.ToArray()); } } return(temp2.ToArray()); }
List <Dictionary <string, int> > GetALUSets(ExcelQuery query, bool compareRows, List <string> searchTerms, List <string> excludes) { List <Dictionary <string, int> > set = new List <Dictionary <string, int> >(); List <List <string> > list = new List <List <string> >(); string err = string.Empty; //Get 1st sheet string[] sheets = query.GetSheetNames(); if (sheets == null || sheets.Length > 1) { Debug.LogError("Sheet missing or more than one sheet! Quitting"); return(null); } //use first sheet in our query, whatever it is named query.GetNewSheet(sheets[0]); //Get titles string[] titles = query.GetTitle(0, ref err); if (titles == null) { Debug.Log("No titles found! Quitting"); return(null); } int len = titles.Length; int uid_col = SheetUtils.FindMatchIndexesInStringArr(titles, UID_ColumnNames.ToArray())[0]; if (uid_col < 0) { Debug.LogError(string.Format("couldn't find UID column")); return(null); } else { Debug.Log(string.Format("Found uid_column at {0} which is header {1}", uid_col, query.GetHeaderColumnName(uid_col))); } HashSet <int> skips = new HashSet <int>(SheetUtils.FindMatchIndexesInStringArr(titles, UPC_ColumnNames.ToArray())); //search titles for "UPC" or "Barcode" for (int col = 0; col < len; col++) { foreach (string heading in searchTerms) { if (titles[col].Contains(heading, StringComparison.OrdinalIgnoreCase)) { bool exclude = false; foreach (string exclusion in excludes) { if (titles[col].Contains(exclusion, StringComparison.OrdinalIgnoreCase)) { exclude = true; } } if (exclude) { continue; } Dictionary <string, int> column = new Dictionary <string, int>(); set.Add(column); List <string> sublist = new List <string>(); list.Add(sublist); //add all values for that column to dictionary with row as value string[] vals = query.GetColumn <string>(col, "(_._)"); for (int row = 0; row < vals.Length; row++) { string val = vals[row]; if (val == "(_._)") { continue; //skip our null sentinel } sublist.Add(val); if (column.ContainsKey(val)) { if (compareRows) { LogResult(string.Format("found {0} misses between row {1} and row {2}", Compare_Rows_Skip_Mismatched_UPC_If_ItemIDs_Equal(query, row + 1, column[val] + 1, titles.Length, uid_col, skips), column[val] + 1, row + 1)); } else { LogResult(string.Format("Current row:{0} Subset for column:{1} already contains val:{2} at row:{3}", row + 2, query.GetHeaderColumnName(col), val, column[val] + 2)); } } else { column.Add(val, row); } } } } } aluColumns.Add(list); return(set); }
private void GetColumnHeadings(ItemList list) { if (list.Headings.Count == 0 && list.listName != string.Empty) { if (GUILayout.Button("Get Column Headings")) { string sheetPath = UtilScript.GetPath("InventoryItem"); if (!string.IsNullOrEmpty(sheetPath)) { if (!File.Exists(sheetPath)) { Debug.LogWarning(string.Format("Sheet Path {0} does not exist.", sheetPath)); return; } string guid = AssetDatabase.CreateFolder("Assets", list.listName); string path = AssetDatabase.GUIDToAssetPath(guid); guid = AssetDatabase.CreateFolder(path, "values"); string subPath = AssetDatabase.GUIDToAssetPath(guid); ExcelQuery q = new ExcelQuery(sheetPath); q.GetNewSheet(q.GetSheetNames()[0]); string err = string.Empty; string[] titles = q.GetTitle(0, ref err); if (err != string.Empty) { Debug.LogError(string.Format("Could not read sheet titles from first sheet {0} of {1}", q.GetSheetNames()[0], sheetPath)); return; } else { int len = titles.Length; for (int i = 0; i < len; i++) { StringDataValue name = Instantiate(list.NameValuePrefab); name.name = "HeadingName_" + titles[i]; AssetDatabase.CreateAsset(name, subPath + "/" + name.name + ".asset"); IntDataValue index = Instantiate(list.IndexValuePrefab); index.name = "HeadingIndex_" + titles[i]; AssetDatabase.CreateAsset(index, subPath + "/" + index.name + ".asset"); ColumnHeading newHeading = Instantiate(list.ColumnHeadingPrefab); newHeading.name = "ColumnHeading_" + titles[i]; AssetDatabase.CreateAsset(newHeading, path + "/" + newHeading.name + ".asset"); newHeading.Name = name; newHeading.Index = index; newHeading.Name.value = titles[i]; newHeading.Index.value = i; EditorUtility.SetDirty(newHeading); EditorUtility.SetDirty(name); EditorUtility.SetDirty(index); list.Headings.Add(newHeading); } } } AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); } } }
void ColumnCheck(ExcelQuery query, string heading) { string err = string.Empty; //use first sheet in our query, whatever it is named query.GetNewSheet(query.GetSheetNames()[0]); //Get titles string[] titles = query.GetTitle(0, ref err); if (titles == null) { Debug.Log("No titles found! Quitting"); return; } int len = titles.Length; int uid_col = SheetUtils.FindMatchIndexesInStringArr(titles, UID_ColumnNames.ToArray())[0]; if (uid_col < 0) { Debug.LogError(string.Format("couldn't find UID column")); return; } else { Debug.Log(string.Format("Found uid_column at {0} which is header {1}", uid_col, query.GetHeaderColumnName(uid_col))); } for (int col = 0; col < len; col++) { if (titles[col].Equals(heading, StringComparison.OrdinalIgnoreCase)) { Dictionary <long, int> column = new Dictionary <long, int>(); //add all values for that column to dictionary with row as value long[] vals = query.GetColumn <long>(col, -1); for (int row = 0; row < vals.Length; row++) { long val = vals[row]; if (val == -1) { continue; //skip our null sentinel } if (column.ContainsKey(val)) { string[] duplicate = query.GetRow(row + 1, "(_._)", len); string[] original = query.GetRow(column[val] + 1, "(_._)", len); int result = CompareRows(duplicate, original); if (result < 3 && original[uid_col] != duplicate[uid_col]) { LogResult(string.Format("Problem! found almost duplicate upc and row (misses:{0}) with non-identical itemids: row {1} (item:{3}) and row {2} (item:{4})", result, column[val] + 1, row + 1, original[uid_col], duplicate[uid_col])); continue; } if (result > 2 && original[uid_col] == duplicate[uid_col]) { LogResult(string.Format("Problem! found duplicate upc with non-duplicate rows (misses:{0}) but with identical itemids: row {1} (item:{3}) and row {2} (item:{4})", result, column[val] + 1, row + 1, original[uid_col], duplicate[uid_col])); continue; } if (result < 3 && result > 0) { LogResult(string.Format("found almost duplicate upc/itemid (misses:{0}) we expect item:{1} at row:{2} will not be added because item:{3} exists at row:{4}", result, duplicate[uid_col], row + 1, original[uid_col], column[val] + 1)); continue; } if (result < 1) { LogResult(string.Format("found duplicate upc/itemid (misses:{0}) we expect item:{1} at row:{2} will not be added because item:{3} exists at row:{4}", result, duplicate[uid_col], row + 1, original[uid_col], column[val] + 1)); continue; } if (result > 2) { LogResult(string.Format("found non-duplicate items with the same UPC: {0} misses between row {1} (item:{3}) and row {2} (item:{4})", result, column[val] + 1, row + 1, original[uid_col], duplicate[uid_col])); continue; } LogResult(string.Format("somehow managed to miss a case: found {0} misses between row {1} (item:{3}) and row {2} (item:{4})", result, column[val] + 1, row + 1, original[uid_col], duplicate[uid_col])); } else { column.Add(val, row); } } } } return; }