PRC8/nwn/nwnprc/DocGen/trunk/prc/utils/Duplicate2daEntryDetector.java
Jaysyn904 5914ed2ab5 Updated Release Archive
Updated Release Archive.  Fixed Mage-killer prereqs.  Removed old LETO & ConvoCC related files.  Added organized spell scroll store.  Fixed Gloura spellbook. Various TLK fixes.  Reorganized Repo.  Removed invalid user folders. Added DocGen back in.
2023-08-22 10:00:21 -04:00

128 lines
4.3 KiB
Java

package prc.utils;
import prc.autodoc.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.TreeMap;
import static prc.Main.err_pr;
/**
* Checks the given column in the given 2da for duplicate entries.
*
* @author Ornedan
*/
public class Duplicate2daEntryDetector {
private static boolean ignoreCase = false;
private static boolean accountEmpty = false;
/**
* Ye olde main.
*
* @param args
*/
public static void main(String[] args) {
if (args.length == 0) readMe();
String filePath = null;
ArrayList<String> labels = new ArrayList<String>();
// parse args
for (String param : args) {//[--help] | [-i] pathof2da columnlabel+
// Parameter parseage
if (param.startsWith("-")) {
if (param.equals("--help")) readMe();
else {
for (char c : param.substring(1).toCharArray()) {
switch (c) {
case 'c':
ignoreCase = true;
break;
case 'e':
accountEmpty = true;
break;
default:
System.out.println("Unknown parameter: " + c);
readMe();
}
}
}
} else {
// It's a pathname
if (filePath == null)
filePath = param;
else
labels.add(param);
}
}
// Load the 2da
Data_2da file = Data_2da.load2da(filePath);
// Test the columns
for (String label : labels) {
TreeMap<String, ArrayList<Integer>> duplicates = new TreeMap<String, ArrayList<Integer>>();
// Examine column
HashMap<String, Integer> entries = new HashMap<String, Integer>();
String value;
for (int i = 0; i < file.getEntryCount(); i++) {
value = accountForCase(file, label, i);
// Do not account for empty entries unless requested
if (value.equals("****") && !accountEmpty)
continue;
if (!entries.containsKey(value))
entries.put(value, i);
else {
// If no duplicates of this value have yet been found, init the arraylist for it
if (!duplicates.containsKey(value)) {
duplicates.put(value, new ArrayList<Integer>());
duplicates.get(value).add(entries.get(value));
}
// Either way, add the current row to the list of duplicates
duplicates.get(value).add(i);
}
}
for (ArrayList<Integer> duprows : duplicates.values()) {
StringBuffer toPrint = new StringBuffer(file.getName() + ": duplicate " + label + " on rows");
boolean first = true;
for (int row : duprows) {
if (!first)
toPrint.append(',');
else
first = false;
toPrint.append(" " + row);
}
err_pr.println(toPrint.toString());
}
}
}
private static String accountForCase(Data_2da data, String label, int index) {
return ignoreCase ?
data.getEntry(label, index).toLowerCase() :
data.getEntry(label, index);
}
private static void readMe() {
System.out.println("Usage:\n" +
" [--help] | [-ce] pathof2da columnlabel+\n" +
"\n" +
" pathof2da path of the 2da to check\n" +
" columnlabel label of a column to test for duplicate entries\n" +
"\n" +
" -c ignores case of the entries testes for duplicacy\n" +
" -e does not ignore empty entries. ie, ****\n" +
"\n" +
" --help prints this text\n" +
"\n" +
"Unless -e is specified, empty entries (****) do not count as duplicates\n"
);
System.exit(0);
}
}