Добавить запятые в файл - PullRequest
2 голосов
/ 29 декабря 2008

Это мой первый вопрос на этом форуме ... У меня есть файл с многочисленными полями данных (как числовыми, так и символьными) в файле. Я хочу разделить файл с длиной разделителя, например, 2,5,1,9,6 и т. Д.

( В качестве альтернативы: у меня есть список длин полей, например 2,5,1,9,6, и я хочу вставить разделители запятых в (копию) строки источника после каждого поля. *)

Например, если мой файл такой:

9483trdcvge245621jde

тогда мне нужно вставить запятые в 2,5,1,9,6 и т. Д. и вывод будет:

94,83trd,c,vge245621,jde,

Мне нужно сделать это в JAVA

Пожалуйста, помогите мне решить эту проблему. Заранее спасибо

Ответы [ 8 ]

7 голосов
/ 29 декабря 2008
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();
}
3 голосов
/ 29 декабря 2008

Считайте файл как 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 голосов
/ 29 декабря 2008

Я думаю, я бы сделал это так

  • 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();
}
1 голос
/ 29 декабря 2008

Вот одно из решений:

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.)

1 голос
/ 29 декабря 2008
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

1 голос
/ 29 декабря 2008

Предполагая, что у вас есть все это как Strings, вы можете использовать String.substring (начало, конец). Затем просто добавьте + подстроки и запятые вместе.

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

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

и т.д ...

Примечание: Использование + для добавления строки таким образом очень медленно, поскольку она перераспределяет и перемещает данные каждый раз. Существуют более быстрые способы объединения String с, если скорость является проблемой.

1 голос
/ 29 декабря 2008

Мне кажется, я не понимаю вопроса. Читайте файл построчно и вставляйте запятые в строку.

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

Конечно, это ужасно неэффективно и может быть оптимизировано многими способами.

0 голосов
/ 29 декабря 2008

Это, наверное, самое странное требование, которое я когда-либо видел, но в любом случае ...

Псуедо-код

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...