Java,从文本文件中读取(文本文件格式奇怪)

时间:2015-03-17 17:09:16

标签: java loops io

我知道如何从文本文件中读取数据,其中所有信息都由行分隔,但是这个文本文件的格式我正在努力读入和循环。我想要做的是阅读顶线,这是产品的数量,所以我想制作一个数组(而不是ArrayList)与那么多的地方,然后阅读第二行的产品代码,然后阅读第3行价格并重复,直到所有产品都添加到阵列。

这是文件

productData.txt (#分隔值)

10
PA/1234#PV/5732#Au/9271#DT/9489#HY/7195#ZR/7413#bT/4674#LR/4992#Xk/8536#kD/9767#
153#25#172#95#235#159#725#629#112#559#

我正在努力解决这个问题,并希望你们中的一个能告诉我它是如何失败或指向正确的方向。

3 个答案:

答案 0 :(得分:2)

注意:我没有文件,或者带有构造函数的类Product,它接受了价格和产品代码,但我相信他会工作。

我必须做类似的事情,我在csv文件(逗号分隔值)中分隔值,所以我使用了类似的东西。

File productData = new File("productData.txt");
Scanner sc = new Scanner(productData);
Integer size = new Integer(sc.nextLine());
Product[] products = new Product[size];
String[] code = new String[size];
int[] price = new int[size];
int countLine = 0;

while (sc.hasNextLine())
{
    int count = 0;
    String line = new String(sc.nextLine());
    for (String retval: line.split("#"))
    {
        if (countLine == 0) {
            code[count] = retval;
        } else if (countLine == 1) {
            price[count] = Double.parseDouble(retval);
        }
        count++;
    }
}

for (int i = 0; i < size; i++)
{
    products[i] = new Product(code[i], price[i]);
}

我在这里做的是先导入文件,然后创建一个新的Scanner。我从第一行的整数中创建了一个名为size的新int。接下来,我制作了3个数组。一个用于最终产品,一个用于产品代码,一个用于价格。我也做了一个整数来计算我在哪一行。现在,我做了一个while循环,一直持续到没有剩下的行。我创建一个名为line的字符串,即文件中的行,然后我将其拆分为#。接下来,我创建了一个遍历每个产品代码/价格的for循环,并将其转换为名为retval(返回值)的字符串。然后我做了一个if语句,如果它在产品代码行上,那么将每个代码设置为数组,代码。否则,如果它在价格线上,则将每个价格设置为数组,价格。最后,我使用for循环将代码数组和价格数组合并到products数组中。

答案 1 :(得分:1)

如果你不想采用正则表达式方式,看起来你可以得到每一行并用数字字符分割它们。这是一个例子:

public class MyTest {
    public static final void main (String[] args)
    {
        String str = "10\n" +
            "PA/1234#PV/5732#Au/9271#DT/9489#HY/7195#ZR/7413#bT/4674#LR/4992#Xk/8536#kD/9767#\n" +
            "153#25#172#95#235#159#725#629#112#559#";

        String[] arr = str.split("\n");
        ArrayList<Object[]> al = new ArrayList<>();
        String[] product = arr[1].split("#");
        String[] price = arr[2].split("#");

        for (int i = 0; i < product.length; i++)
        {
            al.add(new Object[] { product[i], Integer.parseInt(price[2]) });
        }

        System.out.println(Arrays.deepToString(al.toArray()));
    }
}

请记住,我没有进行任何健全性检查或异常捕获/处理,您绝对应该这样做。这只是让你前进的一个简单例子。

答案 2 :(得分:0)

注意:没有执行任何验证。它仅适用于完美的场景,即文件是否与您提到的完全相同的结构

public static void main(String[] args) {
		
		try {
			InputStreamReader in = new InputStreamReader(new FileInputStream("D:/productData.txt"));
			BufferedReader buffer = new BufferedReader(in);
			
			String readline;
			int line_count=0;// no of line in the file
			int num_of_prod = 0; 
			float[] prod_price = null;
			String[] prod_code = null;
			
			while((readline=buffer.readLine())!=null){
				line_count++;
				// read the first line from the file 
				if(line_count==1){
					// read the first line and creating the array 
					num_of_prod = Integer.parseInt(readline);
					prod_code = new String[num_of_prod];
					prod_price = new float[num_of_prod];
				}
				
				else if(line_count==2){
					
					prod_code = readline.split("#");
				}
				
				else if(line_count == 3){
					String[] string_price_arr = readline.split("#");
					
					// converts the string array into float array for performing summation
					for(int i=0;i<num_of_prod;i++)
						prod_price[i]=Integer.parseInt(string_price_arr[i]);
					
					
				}
				
			}
			buffer.close();
			System.out.println("Product code");
			for(int i=0;i<num_of_prod;i++){
				
				System.out.println(prod_code[i]);
			}
			
			// do the same for product price
			
		} catch (IOException e) {e.printStackTrace();}
	}