Java 读入一个txt文件,分隔并存储变量(字符串、双精度和整数),以备以后使用

Java 读入一个txt文件,分隔并存储变量(字符串、双精度和整数),以备以后使用,java,Java,java程序员初学者, 我正在寻找一种方法,在处理与班次类型、交易类型和成本相关的某些数据时读取txt文件(从收银台输出),以获得我想要的结果 任何帮助都将不胜感激 txt文档中的示例行: “卡片”、“05-07-201210:32:42”、“层压A4”,10、10,“夜班”,1486510814,假,130 因此,我需要的相关信息是粗体的,文本行中的其余信息是无关的 我需要找到昨天(2012年7月5日)在夜班进行的所有卡交易的总成本 到目前为止,我已经做到了这一点,我试图在夜班时分手。还考虑过

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

任何帮助都将不胜感激

txt文档中的示例行:

卡片”、“05-07-201210:32:42”、“层压A4”,10、10,“夜班”,1486510814,假,130

因此,我需要的相关信息是粗体的,文本行中的其余信息是无关的

我需要找到昨天(2012年7月5日)在夜班进行的所有交易的总成本

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

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

}
}
}
}
导入java.io.File;
导入java.io.FileNotFoundException;
导入java.text.simpleDataFormat;
导入java.util.*;
公共类查找器{
公共静态void main(字符串args[])引发FileNotFoundException
{
Calendar today=Calendar.getInstance();
SimpleDataFormat格式化程序=
新的简化格式(“dd-MM-yyyy”);
添加(Calendar.DATE,-1);
String昨天=formatter.format(today.getTime());
Scanner sc=新扫描仪(新文件(“textdocument.log”);
while(sc.hasNextLine()){
字符串[]numstrs=sc.nextLine().split(昨天+“\”夜班“);//按分割
对于(int i=0;i
期望输出:

2012年7月5日夜班总数

现金总额20美元

信用卡总额40美元

EFTPO总额20美元

我希望我已经问清楚了


谢谢

如果数据始终保持相同的格式,我建议您使用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
将始终是行中的第六个值。其他信息也同样适用

由于您拥有的文件是字符分隔的,在本例中,使用逗号,您可以使用Open CSV来处理该文件

提取所需的部分后,如果需要,可以使用
.replaceAll
函数从提取的数据中删除引号。然后可以比较所提取的字符串(Apache的
StringUtils
类可能很有用)

如果字符串等于夜班
,则可以使用我昨天附带的代码段继续检查日期是否为昨天。如果日期匹配,则可以使用Java CSV提取成本,将其转换为数值(由于您处理的是成本问题,我建议使用
bigdecimic
类,因为它与
float
double
相比没有舍入问题)并执行您需要的任何数学运算


所有这些都应该反过来给你你想要的东西。

你可以试试这样的东西:

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

您可以使用CSV解析器,或者如果引号中没有
,您可以沿着
拆分,然后获取数据以放入模板输出中。这是我的新程序,它现在看起来如何?好的,谢谢,但是夜班的一个实例呢?而且我仍然不确定在删除"我确切地知道如何正确地存储变量?我不介意它们是否覆盖文本文件的每一行,只要总数计算正确。“line”是否就是我存储文本文件中当前行的变量?@user1511032:我修改了我的答案。我怀疑我能否用更简单的术语来表达这一点。如果你有任何疑问的话关于这个问题的其他问题请告诉我。谢谢你的帮助,我简直不敢相信一个简单的任务能做多少工作。我不能按列分割,而不是将成本加起来,每当Colum 1、2和6等于昨天的日期和夜班,或者必须执行CSV分析吗?我也不能删除“.”“从任何一个side@user1511032:是的,您可以只使用
.split()
函数,CSV解析框架更加健壮。如果您这样做:
String card=line.split(“,”[0]。replaceAll(“\”,”);
,您应该能够获得
卡的字符串值,这就是您所需要的。此外,由于舍入错误,请记住我的建议,使用
bigdecimic
。Catch仅用于封装找不到的文件,或者由于某种原因,文件的格式不同,这显然是不应该的。这里是Catch iInteger.valueOf(..)需要:如果nextToken()不是int,Integer.class将引发异常。