0

初学者 java 程序员,我正在寻找一种在处理与班次类型、事务类型和成本相关的某些数据时读取 txt 文件(从收银台输出)的方法,以提供我想要的结果。

任何帮助将不胜感激。

txt 文档中的示例行:

卡片”,“ 2012 年 5 月 7 日10:32:42 ”,“层压 A4”,10、10,“夜班”,1486510814,假,130

所以我需要的相关信息以粗体显示,文本行中的其余信息无关紧要。

我需要找到昨天(05-07-2012)在Nightshift上进行的所有交易的总成本

到目前为止,我已经到了这里,我试图在夜班时分开。还考虑过使用数组并将每个值存储到自己的变量中,但发现这太难了。

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();

}
}
}
}

期望的输出:

夜班总计 05-07-2012

现金总额 $20

卡总 $40

Eftpos 总计 20 美元

我希望我已经问清楚了。

谢谢

4

2 回答 2

1

如果数据将始终保持相同的格式,我建议您使用 CSV 解析器,例如Java CSV来解析您的文件。假设文件具有标准格式,您应该可以毫无问题地选择所需的字段。

如果要删除引号 ( "),可以使用该.replaceAll("\"","");函数删除它们(一旦拆分数据并获得所需的字段)。

最后,如之前的 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 提取成本,将其转换为数值(因为您正在处理成本,我会推荐该类,因为与orBigDecimal相比,它没有舍入问题)并做任何数学运算您需要的操作。floatdouble

所有这一切都应该反过来,给你你所追求的。

于 2012-07-09T06:05:26.413 回答
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());
    }
    // }
于 2012-07-09T07:50:07.393 回答