这是我在这个论坛的第一个问题...... 我有一个文件中包含大量数据字段(数字和字符)的文件。 我想用一组分隔符长度分隔文件,如2,5,1,9,6等。
(或者:我有一个字段长度列表,如2,5,1,9,6,我想在每个字段后面的源字符串的(副本)中插入逗号分隔符。)
例如,如果我的文件是这样的:
9483trdcvge245621jde
然后我需要在2,5,1,9,6等处插入逗号 输出将是:
94,83trd,c,vge245621,jde,
我需要在 JAVA
中执行此操作请帮我解决这个问题。 提前致谢
答案 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();