在文件中添加逗号

时间:2008-12-29 12:48:41

标签: java

这是我在这个论坛的第一个问题...... 我有一个文件中包含大量数据字段(数字和字符)的文件。 我想用一组分隔符长度分隔文件,如2,5,1,9,6等。

或者:我有一个字段长度列表,如2,5,1,9,6,我想在每个字段后面的源字符串的(副本)中插入逗号分隔符。

例如,如果我的文件是这样的:

9483trdcvge245621jde

然后我需要在2,5,1,9,6等处插入逗号 输出将是:

94,83trd,c,vge245621,jde,

我需要在 JAVA

中执行此操作

请帮我解决这个问题。 提前致谢

8 个答案:

答案 0 :(得分:7)

if (myString.equals("9483trdcvge245621jde")) {
        myString = "94,83trd,c,vge245621,jde";
    }

开玩笑地说; - )

我觉得这样......

private static final int[] pos = {2, 5, 1, 9, 6};
private static final String DIV = ",";

public static String parse(String str) {
    int start = 0;
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < pos.length; i++) {
        if (i > 0) { 
            sb.append(DIV);
        }
        int end = start + pos[i];
        if (end <= str.length()) {
            sb.append(str.substring(start, end));
            start = end;
        } else {
            sb.append(str.substring(start));
        }

    }
    return sb.toString();
}

答案 1 :(得分:3)

以StringBuilder的形式读入文件,然后使用类似

的内容
StringBuilder sb = new StringBuilder(file); //The string builder
while (/*the string builder isn't finished*/)
{
  int position = ;//The position you want the comma at 2 or 4 or whatever
  sb.insert(position, ",");
}

根据需要循环多次。

答案 2 :(得分:2)

我想我会这样做

  • str是输入字符串
  • pos是部分的长度,之后我们应该使用逗号

代码:

public static String partition(String str, int[] pos) {
    int oldPos = 0;
    StringBuilder builder = new StringBuilder(str.length() + pos.length);
    for(int len : pos) {
        builder.append(str.substring(oldPos, oldPos+len)).append(',');
        oldPos += len;
    }
    builder.append(str.substring(oldPos)).append(',');
    return builder.toString();
}

答案 3 :(得分:1)

我想我不明白这个问题。逐行读取文件,并在字符串中插入逗号。

String newString = line.substring(0, firstComma) + "," + line.substring(firstComma + 1);

当然,这种效率非常低,可以通过多种方式进行优化。

答案 4 :(得分:1)

假设您拥有Strings所有这些,您可以使用String.substring(start,end)。然后简单地将+子串和逗号附加在一起。

String data = "9483trdcvge245621jde";
String result = "";

result += data.substring(0,2) + ",";
result += data.substring(2, 7) + ",";
result += data.substring(7, 8) + ",";

等...

注意:使用+追加这样的字符串非常慢,因为它每次重新分配和移动数据。如果速度是一个问题,有更快的方法可以连接String

答案 5 :(得分:1)

String newString = "";
int[] positions = { 2, 5, 1, 9, 6 }; //etc
for (int i = 0; i > positions.length; i++) {
    String tempString = "";
    if (i == positions.length) { //for the last item
      tempString = oldString.substring(0, positions[i]);
    }
    else { //every item except the last item
      tempString = oldString.substring(0, positions[i]) + ",";
    }
    oldString = oldString.substring(positions[i]);
    newString += tempString;
}

存储阵列中的位置。迭代,将分隔的字符串添加到新字符串并将其从旧字符串中删除。 这可能不是最好的方法,但它是我如何做到的。 :P

答案 6 :(得分:1)

这是一个解决方案:

package com.foo;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class Commafy {

    public static final String SEPARATOR = ",";

    private static void fail(String message) {
        System.err.println(message);
        System.exit(1);
    }

    private static int[] argsAsInts(String[] args) {
        if (args.length < 2) {
            fail("argument list of file name followed by field lengths is required");
        }
        int[] result = new int[args.length - 1];
        for (int i = 1; i < args.length; ++i) {
            try {
                result[i - 1] = Integer.parseInt(args[i]);
            } catch (NumberFormatException nfe) {
                fail("can't convert argument \"" + args[i] + "\" to integer");
            }
        }
        return result;
    }

    private static int[] partialSums(int[] lengths) {
        int[] result = new int[lengths.length];
        int start = 0;
        for (int i = 0; i < lengths.length; ++i) {
            result[i] = start;
            start += lengths[i];
        }
        return result;
    }

    private static int[] fieldsEndAt(int[] lengths, int[] starts) {
        int[] result = new int[lengths.length];
        for (int i = 0; i < lengths.length; ++i) {
            result[i] = starts[i] + lengths[i];
        }
        return result;
    }

    private static void process(
        String fileName, int[] starts, int[] ends
    ) throws IOException {
        BufferedReader br = new BufferedReader(
            new FileReader(fileName)
        );
        final int MIN_LENGTH = ends[ends.length - 1];
        String line = br.readLine();
        while (line != null) {
            if (line.length() < MIN_LENGTH) {
                System.err.println("short input line \"" + line +"\" skipped");
            } else {
                StringBuilder sb = new StringBuilder();
                String separate = "";
                for (int i = 0; i < starts.length; ++i) {
                    sb.append(separate).append(line.substring(starts[i], ends[i]));
                    separate = SEPARATOR;
                }
                System.out.println(sb.toString());
            }
            line = br.readLine();
        }
        br.close();
    }

    public static void main(String[] args) {
        int[] lengths = argsAsInts(args);
        int[] starts = partialSums(lengths);
        int[] ends = fieldsEndAt(lengths, starts);
        try {
            process(args[0], starts, ends);
        } catch (IOException e) {
            fail("I/O Exception while processing input");
        }
    }

}

给定一个名为data/fixedlengthdata.text的数据文件,其中包含:

9483trdcvge245621jde
9483trdcvge245621jdelong
9483trdcvge245621
9483trdcvge245621jde

并使用以下参数运行:

data/fixedlengthdata.text 2 5 1 9 3

它产生的输出:

94,83trd,c,vge245621,jde
94,83trd,c,vge245621,jde
short input line "9483trdcvge245621" skipped
94,83trd,c,vge245621,jde

(当然,上面的第三行是stderr。)

答案 7 :(得分:0)

这可能是我见过的最离奇的要求,但无论如何......

伪代码

Collection<Integer> indexes; // initialized with indexes to add commas at 
StringBuilder bldr = new StringBuilder();

for (int i = 0; i < inString.length(); i++){

     bldr.append(inString.charAt(i));

     if (indexes.contains(i))
         bldr.append(",");

}

return bldr.toString();