求助!java读取两个txt文件,并分析统计里面的数据后输出

时间:2022-09-11 19:55:15
新手上路,接到需求,用java读取两个txt文件,并分析里面的数据后输出到新文件,详细情况如下:
A.txt:
编号|    日期|      编码|      操作|  账号
01    |20140221|12881|OPT |100000001288100001
02    |20140221|12885|OPT |100000001288500001
03    |20140221|12887|OPT |100000001288700001

B.txt(其中金额正数代表入金,负数代表出,结果为1代表成功,其他代表失败)
编号 |账号|                             金额|结果
01|100000001288100001|88574|1
01|100000001288300001|5443|2
01|100000001288100001|45454|5
01|100000001288100001|8766|1
01|100000001288100001|-455|1
01|100000001288100001|-3445|1

要求统计同一账号的入金次数、出金次数,成功次数,输出格式要求如下:

编码 | 账号 | 出金 | 入金 | 成功次数
12881|100000001288100001|2|2|4

真心搞不定,求高手解答啊。。。。

5 个解决方案

#1


首先,你结果里面的那个编码是什么意思?
我感觉要输出你的结果,只要b文件就可以了
给你个思路,扫描b文件,
然后建一个hashmap(K,V)  key=帐号 value=new Integer[3]{入金次数,出金次数,成功次数}
然后扫描每一行做一个
while(hashmap.contains(K))
{
if(金额>0)入金次数+1
if(金额<0)出金次数+1
if(结果=1)成功次数+1
}

#2


引用 1 楼 ok350350 的回复:
首先,你结果里面的那个编码是什么意思?
我感觉要输出你的结果,只要b文件就可以了
给你个思路,扫描b文件,
然后建一个hashmap(K,V)  key=帐号 value=new Integer[3]{入金次数,出金次数,成功次数}
然后扫描每一行做一个
while(hashmap.contains(K))
{
if(金额>0)入金次数+1
if(金额<0)出金次数+1
if(结果=1)成功次数+1
}

编码指的是A文件中的编码,B文件中没有,用list如何实现呢?

#3



package test;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.*;

public class FileCount {
    public static void main(String[] args) throws Exception {
        //先读取A.txt,将编码和账号存储到map中
        FileReader afr = new FileReader("C:/java_test/A.txt");
        BufferedReader ar = new BufferedReader(afr);
        String aline = null;
        Map<String, String> codeMap = new HashMap<String, String>();
        while ((aline = ar.readLine()) != null) {
            String[] array = aline.split("\\|");
            codeMap.put(array[4], array[2]);
        }
        ar.close();
        //再读取B.txt,将交易信息存储到map中
        FileReader fr = new FileReader("C:/java_test/B.txt");
        BufferedReader br = new BufferedReader(fr);
        String line = null;
        Map<String, int[]> map = new HashMap<String, int[]>();
        while ((line = br.readLine()) != null) {
            String[] array = line.split("\\|");
            String acct = array[1];
            int[] count = map.get(acct);
            if (count == null) {
                count = new int[] { 0, 0, 0 };
                map.put(acct, count);
            }
            int amt = Integer.parseInt(array[2]);
            if (amt >= 0) {
                count[0] += 1;
            } else {
                count[1] += 1;
            }
            if ("1".equals(array[3])) {
                count[2] += 1;
            }
        }
        br.close();
        FileWriter fw = new FileWriter("c:/java_test/C.txt");
        BufferedWriter bw = new BufferedWriter(fw);
        int j = 0;
        for (Map.Entry<String, int[]> entry : map.entrySet()) {
            int[] count = entry.getValue();
            StringBuffer sb = new StringBuffer();
            sb.append(codeMap.get(entry.getKey())).append("|");
            sb.append(entry.getKey()).append("|").append(count[0]).append("|").append(count[1])
                    .append("|").append(count[2]).append("\r\n");
            bw.write(sb.toString());
            j++;
            if (j % 100 == 0) {
                bw.flush();
            }
        }
        bw.close();
    }
}

#4


引用 3 楼 wangxf_8341 的回复:

package test;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.*;

public class FileCount {
    public static void main(String[] args) throws Exception {
        //先读取A.txt,将编码和账号存储到map中
        FileReader afr = new FileReader("C:/java_test/A.txt");
        BufferedReader ar = new BufferedReader(afr);
        String aline = null;
        Map<String, String> codeMap = new HashMap<String, String>();
        while ((aline = ar.readLine()) != null) {
            String[] array = aline.split("\\|");
            codeMap.put(array[4], array[2]);
        }
        ar.close();
        //再读取B.txt,将交易信息存储到map中
        FileReader fr = new FileReader("C:/java_test/B.txt");
        BufferedReader br = new BufferedReader(fr);
        String line = null;
        Map<String, int[]> map = new HashMap<String, int[]>();
        while ((line = br.readLine()) != null) {
            String[] array = line.split("\\|");
            String acct = array[1];
            int[] count = map.get(acct);
            if (count == null) {
                count = new int[] { 0, 0, 0 };
                map.put(acct, count);
            }
            int amt = Integer.parseInt(array[2]);
            if (amt >= 0) {
                count[0] += 1;
            } else {
                count[1] += 1;
            }
            if ("1".equals(array[3])) {
                count[2] += 1;
            }
        }
        br.close();
        FileWriter fw = new FileWriter("c:/java_test/C.txt");
        BufferedWriter bw = new BufferedWriter(fw);
        int j = 0;
        for (Map.Entry<String, int[]> entry : map.entrySet()) {
            int[] count = entry.getValue();
            StringBuffer sb = new StringBuffer();
            sb.append(codeMap.get(entry.getKey())).append("|");
            sb.append(entry.getKey()).append("|").append(count[0]).append("|").append(count[1])
                    .append("|").append(count[2]).append("\r\n");
            bw.write(sb.toString());
            j++;
            if (j % 100 == 0) {
                bw.flush();
            }
        }
        bw.close();
    }
}


受教了,谢谢!

#5


public static void Changedata(String[][] bankA, String[][] bankB)
{
int chujin=0;
int rujin=0;
int success=0;
int n;
int second;
int num[]={0,0,0};
System.out.println("***************");
System.out.println("编码 账号 出金 入金 成功次数");
for(int j=1;j<bankB.length-1;j++)
{
int money=Integer.parseInt(bankB[j][2]);
if(money>0)
{
rujin++;
}
else if(money<0)
{
chujin++;
}
for(int i=j+1;i<bankB.length;i++)
    {
   n=Integer.parseInt(bankB[i][3]);
   second=Integer.parseInt(bankB[i][2]);
   if(n==1)
   {
  if(bankB[j][1].compareTo(bankB[i][1])==0) 
  {
  if(second>0)
          {
       rujin++;
          }
  else if(second<0)
          {
       chujin++;
          }
  }
   }
   success=rujin+chujin;
   }
   //System.out.println("***************");
   //System.out.println("缂栫爜 璐﹀彿 鍑洪噾 鍏ラ噾 鎴愬姛娆℃暟");
   for(int k=1;k<bankA.length;k++)
   {
   //String temp=bankA[k][4];
   if(bankB[j][1].compareTo(bankA[k][4])==0&&(num[k])!=1)
   {
   System.out.print(bankA[k][2]+" "+bankA[k][4]+" ");
   System.out.print(chujin+" "+rujin+" "+success+"\n");
   chujin=0;
   rujin=0;
   success=0;
   //String temp=bankA[k][4];
   num[k]=1;
   break;
   }
   }
}
}

程序没有问题,自己已经测试过了,可以使用的。

#1


首先,你结果里面的那个编码是什么意思?
我感觉要输出你的结果,只要b文件就可以了
给你个思路,扫描b文件,
然后建一个hashmap(K,V)  key=帐号 value=new Integer[3]{入金次数,出金次数,成功次数}
然后扫描每一行做一个
while(hashmap.contains(K))
{
if(金额>0)入金次数+1
if(金额<0)出金次数+1
if(结果=1)成功次数+1
}

#2


引用 1 楼 ok350350 的回复:
首先,你结果里面的那个编码是什么意思?
我感觉要输出你的结果,只要b文件就可以了
给你个思路,扫描b文件,
然后建一个hashmap(K,V)  key=帐号 value=new Integer[3]{入金次数,出金次数,成功次数}
然后扫描每一行做一个
while(hashmap.contains(K))
{
if(金额>0)入金次数+1
if(金额<0)出金次数+1
if(结果=1)成功次数+1
}

编码指的是A文件中的编码,B文件中没有,用list如何实现呢?

#3



package test;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.*;

public class FileCount {
    public static void main(String[] args) throws Exception {
        //先读取A.txt,将编码和账号存储到map中
        FileReader afr = new FileReader("C:/java_test/A.txt");
        BufferedReader ar = new BufferedReader(afr);
        String aline = null;
        Map<String, String> codeMap = new HashMap<String, String>();
        while ((aline = ar.readLine()) != null) {
            String[] array = aline.split("\\|");
            codeMap.put(array[4], array[2]);
        }
        ar.close();
        //再读取B.txt,将交易信息存储到map中
        FileReader fr = new FileReader("C:/java_test/B.txt");
        BufferedReader br = new BufferedReader(fr);
        String line = null;
        Map<String, int[]> map = new HashMap<String, int[]>();
        while ((line = br.readLine()) != null) {
            String[] array = line.split("\\|");
            String acct = array[1];
            int[] count = map.get(acct);
            if (count == null) {
                count = new int[] { 0, 0, 0 };
                map.put(acct, count);
            }
            int amt = Integer.parseInt(array[2]);
            if (amt >= 0) {
                count[0] += 1;
            } else {
                count[1] += 1;
            }
            if ("1".equals(array[3])) {
                count[2] += 1;
            }
        }
        br.close();
        FileWriter fw = new FileWriter("c:/java_test/C.txt");
        BufferedWriter bw = new BufferedWriter(fw);
        int j = 0;
        for (Map.Entry<String, int[]> entry : map.entrySet()) {
            int[] count = entry.getValue();
            StringBuffer sb = new StringBuffer();
            sb.append(codeMap.get(entry.getKey())).append("|");
            sb.append(entry.getKey()).append("|").append(count[0]).append("|").append(count[1])
                    .append("|").append(count[2]).append("\r\n");
            bw.write(sb.toString());
            j++;
            if (j % 100 == 0) {
                bw.flush();
            }
        }
        bw.close();
    }
}

#4


引用 3 楼 wangxf_8341 的回复:

package test;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.*;

public class FileCount {
    public static void main(String[] args) throws Exception {
        //先读取A.txt,将编码和账号存储到map中
        FileReader afr = new FileReader("C:/java_test/A.txt");
        BufferedReader ar = new BufferedReader(afr);
        String aline = null;
        Map<String, String> codeMap = new HashMap<String, String>();
        while ((aline = ar.readLine()) != null) {
            String[] array = aline.split("\\|");
            codeMap.put(array[4], array[2]);
        }
        ar.close();
        //再读取B.txt,将交易信息存储到map中
        FileReader fr = new FileReader("C:/java_test/B.txt");
        BufferedReader br = new BufferedReader(fr);
        String line = null;
        Map<String, int[]> map = new HashMap<String, int[]>();
        while ((line = br.readLine()) != null) {
            String[] array = line.split("\\|");
            String acct = array[1];
            int[] count = map.get(acct);
            if (count == null) {
                count = new int[] { 0, 0, 0 };
                map.put(acct, count);
            }
            int amt = Integer.parseInt(array[2]);
            if (amt >= 0) {
                count[0] += 1;
            } else {
                count[1] += 1;
            }
            if ("1".equals(array[3])) {
                count[2] += 1;
            }
        }
        br.close();
        FileWriter fw = new FileWriter("c:/java_test/C.txt");
        BufferedWriter bw = new BufferedWriter(fw);
        int j = 0;
        for (Map.Entry<String, int[]> entry : map.entrySet()) {
            int[] count = entry.getValue();
            StringBuffer sb = new StringBuffer();
            sb.append(codeMap.get(entry.getKey())).append("|");
            sb.append(entry.getKey()).append("|").append(count[0]).append("|").append(count[1])
                    .append("|").append(count[2]).append("\r\n");
            bw.write(sb.toString());
            j++;
            if (j % 100 == 0) {
                bw.flush();
            }
        }
        bw.close();
    }
}


受教了,谢谢!

#5


public static void Changedata(String[][] bankA, String[][] bankB)
{
int chujin=0;
int rujin=0;
int success=0;
int n;
int second;
int num[]={0,0,0};
System.out.println("***************");
System.out.println("编码 账号 出金 入金 成功次数");
for(int j=1;j<bankB.length-1;j++)
{
int money=Integer.parseInt(bankB[j][2]);
if(money>0)
{
rujin++;
}
else if(money<0)
{
chujin++;
}
for(int i=j+1;i<bankB.length;i++)
    {
   n=Integer.parseInt(bankB[i][3]);
   second=Integer.parseInt(bankB[i][2]);
   if(n==1)
   {
  if(bankB[j][1].compareTo(bankB[i][1])==0) 
  {
  if(second>0)
          {
       rujin++;
          }
  else if(second<0)
          {
       chujin++;
          }
  }
   }
   success=rujin+chujin;
   }
   //System.out.println("***************");
   //System.out.println("缂栫爜 璐﹀彿 鍑洪噾 鍏ラ噾 鎴愬姛娆℃暟");
   for(int k=1;k<bankA.length;k++)
   {
   //String temp=bankA[k][4];
   if(bankB[j][1].compareTo(bankA[k][4])==0&&(num[k])!=1)
   {
   System.out.print(bankA[k][2]+" "+bankA[k][4]+" ");
   System.out.print(chujin+" "+rujin+" "+success+"\n");
   chujin=0;
   rujin=0;
   success=0;
   //String temp=bankA[k][4];
   num[k]=1;
   break;
   }
   }
}
}

程序没有问题,自己已经测试过了,可以使用的。