0

初心者の Java プログラマー、シフト タイプ、トランザクション タイプ、およびコストに関連する特定のデータを操作しながら、txt ファイル (レジからの出力) を読み取る方法を探しています。

どんな助けでも大歓迎です。

txt ドキュメントの行の例:

"カード"," 05-07-2012 10:32:42","ラミネート A4",10, 10 ,"ナイトシフト",1486510814,False,130

したがって、必要な関連情報は太字で表示され、テキスト行の残りの情報は無関係です。

Nightshiftで昨日(2012 年 5 月 7 日) に行われたすべてのカード取引の総コストを見つける必要がある場合。

これまでのところ、夜勤で分割しようとしました。また、配列を使用して各値を独自の変数に格納することも考えましたが、これは難しすぎることがわかりました。

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

}
}
}
}

望ましい出力:

2012 年 5 月 7 日の夜勤合計

現金合計 $20

カード合計 $40

Eftpos 合計 $20

私は明確に尋ねたことを願っています。

ありがとう

4

2 に答える 2

1

データが常に同じ形式を維持する場合は、 Java CSVなどの 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 を使用してコストを抽出し、それを数値に変換できます (コストを扱っているため、orとはBigDecimal対照的に丸めの問題がないため、このクラスをお勧めします)。必要な操作。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 に答える