读入分隔和存储变量(String,Double和int)的txt文件以供以后使用

时间:2012-07-09 05:59:13

标签: java

初学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美元

我希望我已经清楚地问过了。

由于

2 个答案:

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