gpt4 book ai didi

java - 解析 .txt 文件(考虑性能指标)

转载 作者:行者123 更新时间:2023-12-02 00:21:53 26 4
gpt4 key购买 nike

DurationOfRun:5
ThreadSize:10
ExistingRange:1-1000
NewRange:5000-10000
Percentage:55 - AutoRefreshStoreCategories Data:Previous/30,New/70 UserLogged:true/50,false/50 SleepTime:5000 AttributeGet:1,16,10106,10111 AttributeSet:2060/30,10053/27
Percentage:25 - CrossPromoEditItemRule Data:Previous/60,New/40 UserLogged:true/50,false/50 SleepTime:4000 AttributeGet:1,10107 AttributeSet:10108/34,10109/25
Percentage:20 - CrossPromoManageRules Data:Previous/30,New/70 UserLogged:true/50,false/50 SleepTime:2000 AttributeGet:1,10107 AttributeSet:10108/26,10109/21

我正在尝试解析上面的.txt文件(前四行是固定的,最后三行可以增加意味着它可以超过3行),因此我编写了下面的代码及其工作原理,但它看起来很困惑。那么有没有更好的方法来解析上面的 .txt 文件,如果我们考虑性能,那么这将是解析上面的 txt 文件的最佳方法。

private static int noOfThreads;
private static List<Command> commands;
public static int startRange;
public static int endRange;
public static int newStartRange;
public static int newEndRange;
private static BufferedReader br = null;
private static String sCurrentLine = null;
private static List<String> values;
private static String commandName;
private static String percentage;
private static List<String> attributeIDGet;
private static List<String> attributeIDSet;
private static LinkedHashMap<String, Double> dataCriteria;
private static LinkedHashMap<Boolean, Double> userLoggingCriteria;
private static long sleepTimeOfCommand;
private static long durationOfRun;

br = new BufferedReader(new FileReader("S:\\Testing\\PDSTest1.txt"));
values = new ArrayList<String>();

while ((sCurrentLine = br.readLine()) != null) {
if(sCurrentLine.startsWith("DurationOfRun")) {
durationOfRun = Long.parseLong(sCurrentLine.split(":")[1]);
} else if(sCurrentLine.startsWith("ThreadSize")) {
noOfThreads = Integer.parseInt(sCurrentLine.split(":")[1]);
} else if(sCurrentLine.startsWith("ExistingRange")) {
startRange = Integer.parseInt(sCurrentLine.split(":")[1].split("-")[0]);
endRange = Integer.parseInt(sCurrentLine.split(":")[1].split("-")[1]);
} else if(sCurrentLine.startsWith("NewRange")) {
newStartRange = Integer.parseInt(sCurrentLine.split(":")[1].split("-")[0]);
newEndRange = Integer.parseInt(sCurrentLine.split(":")[1].split("-")[1]);
} else {
attributeIDGet = new ArrayList<String>();
attributeIDSet = new ArrayList<String>();
dataCriteria = new LinkedHashMap<String, Double>();
userLoggingCriteria = new LinkedHashMap<Boolean, Double>();

percentage = sCurrentLine.split("-")[0].split(":")[1].trim();
values = Arrays.asList(sCurrentLine.split("-")[1].trim().split("\\s+"));
for(String s : values) {
if(s.startsWith("Data")) {
String[] data = s.split(":")[1].split(",");
for (String n : data) {
dataCriteria.put(n.split("/")[0], Double.parseDouble(n.split("/")[1]));
}
//dataCriteria.put(data.split("/")[0], value)
} else if(s.startsWith("UserLogged")) {
String[] userLogged = s.split(":")[1].split(",");
for (String t : userLogged) {
userLoggingCriteria.put(Boolean.parseBoolean(t.split("/")[0]), Double.parseDouble(t.split("/")[1]));
}
//userLogged = Boolean.parseBoolean(s.split(":")[1]);
} else if(s.startsWith("SleepTime")) {
sleepTimeOfCommand = Long.parseLong(s.split(":")[1]);
} else if(s.startsWith("AttributeGet")) {
String[] strGet = s.split(":")[1].split(",");
for(String q : strGet) attributeIDGet.add(q);
} else if(s.startsWith("AttributeSet:")) {
String[] strSet = s.split(":")[1].split(",");
for(String p : strSet) attributeIDSet.add(p);
} else {
commandName = s;
}
}
Command command = new Command();
command.setName(commandName);
command.setExecutionPercentage(Double.parseDouble(percentage));
command.setAttributeIDGet(attributeIDGet);
command.setAttributeIDSet(attributeIDSet);
command.setDataUsageCriteria(dataCriteria);
command.setUserLoggingCriteria(userLoggingCriteria);
command.setSleepTime(sleepTimeOfCommand);
commands.add(command);

最佳答案

嗯,一旦你深入到解析器的较低层,解析器通常会变得很困惑:-)

但是,至少在代码质量方面,一个可能的改进是认识到语法是分层的这一事实。

我的意思是每一行都是一个识别标记,后面跟着一些属性。

对于DurationOfRunThreadSizeExistingRangeNewRange来说,属性相对简单。 百分比有点复杂,但仍然可以。

我会将代码构造为(伪代码):

def parseFile (fileHandle):
while (currentLine = fileHandle.getNextLine()) != EOF:
if currentLine.beginsWith ("DurationOfRun:"):
processDurationOfRun (currentLine[14:])

elsif currentLine.beginsWith ("ThreadSize:"):
processThreadSize (currentLine[11:])

elsif currentLine.beginsWith ("ExistingRange:"):
processExistingRange (currentLine[14:])

elsif currentLine.beginsWith ("NewRange:"):
processNewRange (currentLine[9:])

elsif currentLine.beginsWith ("Percentage:"):
processPercentage (currentLine[11:])

else
raise error

然后,在每个 processWhatever() 函数中,您根据预期格式解析该行的其余部分。这使您的代码保持小而可读,并且将来可以轻松更改,而无需在泥沼中导航:-)

例如,processDurationOfRun() 只是从该行的其余部分获取一个整数:

def processDurationOfRun (line):
this.durationOfRun = line.parseAsInt()

类似地,两个范围的函数在 - 上分割字符串,并从结果值中获取两个整数:

def processExistingRange (line):
values[] = line.split("-")
this.existingRangeStart = values[0].parseAsInt()
this.existingRangeEnd = values[1].parseAsInt()

processPercentage() 函数是一个棘手的函数,但如果你也分层它也很容易实现。假设这些东西总是按相同的顺序排列,它包括:

  • 一个整数;
  • 文字-;
  • 某种文本类别;和
  • 一系列键:值对。

甚至这些对内的值也可以由较低级别进行解析,首先用逗号分隔以获得子值,例如 Previous/30New/70,然后用斜杠分割每个子值以获得单独的项目。这样,逻辑层次结构就可以反射(reflect)在您的代码中。

除非您希望每秒解析此文本文件很多次,或者除非它的大小很多兆字节,否则我会更关心可读性和代码的可维护性比解析的速度。

我们需要从代码中榨取最后一丝性能的日子已经一去不复返了,但当发现错误或需要增强时,我们仍然无法及时修复所述代码。

有时最好针对可读性进行优化。

关于java - 解析 .txt 文件(考虑性能指标),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10791918/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com