初学java程序员, 我正在寻找一种方法来读取txt文件(从一个格式输出),同时操纵与班次类型,交易类型和成本相关的某些数据,以便给我我想要的结果。
非常感谢任何帮助。
txt文档中的示例行:
“ CARD ”,“ 05-07-2012 10:32:42”,“Laminate A4”,10, 10 , “的夜班”,1486510814,FALSE,130
所以我需要的相关信息是粗体,文本行中的其他信息是无关紧要的。
我需要在 Nightshift上找到昨天(05-07-2012)所有卡交易的总费用
在我到目前为止的地方,我试图在夜班分手。还考虑使用数组并将每个值存储到自己的变量中,但发现这太难了。
import java.io.File;
import java.io.FileNotFoundException;
import java.text.SimpleDateFormat;
import java.util.*;
public class Finder{
public static void main (String args[]) throws FileNotFoundException
{
Calendar today = Calendar.getInstance();
SimpleDateFormat formatter=
new SimpleDateFormat("dd-MM-yyyy");
today.add(Calendar.DATE, -1);
String yesterday = formatter.format(today.getTime());
Scanner sc = new Scanner(new File("textdocument.log"));
while(sc.hasNextLine()) {
String[] numstrs = sc.nextLine().split(yesterday + "\"NIGHTSHIFT\""); // split by "
for(int i = 0; i < numstrs.length; i++)
{
System.out.println(numstrs[i]);
System.out.println();
}
}
}
}
期望的输出:
Nightshift Totals On 05-07-2012
现金总额$ 20
卡总计40美元
Eftpos总计20美元
我希望我已经清楚地问过了。
由于
答案 0 :(得分:1)
如果数据始终保持相同的格式,我建议您使用CSV解析器(例如Java CSV)来解析文件。假设文件具有标准格式,则在选择所需字段时应该没有问题。
如果要删除引号("
),可以使用.replaceAll("\"","");
函数删除它们(一旦分割了数据并获得了所需的字段)。
最后,正如this之前的SO帖子中所述,您可以检查日期是否恰好是昨天的日期:
Calendar c1 = Calendar.getInstance(); // today
c1.add(Calendar.DAY_OF_YEAR, -1); // yesterday
Calendar c2 = Calendar.getInstance();
c2.setTime(getDateFromLine(line)); // your date
if (c1.get(Calendar.YEAR) == c2.get(Calendar.YEAR)
&& c1.get(Calendar.DAY_OF_YEAR) == c2.get(Calendar.DAY_OF_YEAR)) {
//Do your math here
}
编辑:我会尝试更清楚地说明这一点:
我假设您的所有行都具有相同的格式,如下所示:
"CARD","05-07-2012 10:32:42","Laminate A4",10,10,"NIGHTSHIFT",1486510814,False,130
。这基本上意味着行内的数据将始终保持其顺序,因此,例如,NIGHTSHIFT
将始终是行中的第6个值。这同样适用于其他信息。
由于您拥有的文件是字符分隔的,在本例中是逗号,您可以使用Open CSV处理该文件。
在提取所需的部分后,如果需要,可以使用.replaceAll
函数从已提取的数据中删除引号。然后,您可以比较您拥有的字符串(Apache的StringUtils
类可能很有用)。
如果字符串等于NIGHTSHIFT
,则可以继续使用我昨天附带的代码段检查日期是否为昨天。如果日期匹配,您可以使用Java CSV提取成本,将其转换为数值(因为您处理成本,我建议BigDecimal
类,因为它没有舍入问题而不是{ {1}}或float
)并执行您需要的任何数学运算。
所有这一切都应该反过来给你你所追求的。
答案 1 :(得分:0)
final Pattern p = Pattern.compile("CARD(.*)NIGHTSHIFT");
// Scanner sc = new Scanner(new File("textdocument.log"));
// while (sc.hasNextLine()) {
final String nextString = "\"CARD\",\"05-07-2012 10:32:42\",\"Laminate A4\",10,10,\"NIGHTSHIFT\",1486510814,False,130";
final StringTokenizer st = new StringTokenizer(p.matcher(
nextString.replaceAll("\"", "")).replaceAll("$1"), ",");
while (st.hasMoreTokens()) {
final StringTokenizer sTmp = new StringTokenizer(st.nextToken()
.trim(), " |-");
try {
final Calendar today = Calendar.getInstance();
final int day = Integer.valueOf(sTmp.nextToken());
final int month = Integer.valueOf(sTmp.nextToken());
final int year = Integer.valueOf(sTmp.nextToken());
today.set(year, month, day);
today.add(Calendar.DAY_OF_YEAR, -1);
System.out
.println(new Date(today.getTimeInMillis()).toString());
} catch (final Exception e) {
// I do not understand why catch is used
System.out.println("Integer hangs, skipped line.");
continue;
}
st.nextToken();
st.nextToken();
System.out.println(st.nextToken());
}
// }