2012-05-31 3 views
0

Привет, ребята, Я пишу код, который считывает текстовый файл в этом формате:Получить начальное положение поля

City    |First Name| Second Name|Last Name| 

Выход я в настоящее время является:

Column 1 is 17--------City 
Column 2 is 10--------First Name 
Column 3 is 12--------Second Name 
Column 4 is 9---------Last Name 

Мне нужна Начните также позицию каждого поля в текстовом файле, например:

Column 1 is 17--------City : Position 1 
Column 2 is 10--------First Name: Position 18 
Column 3 is 12--------Second Name: Position 31 
Column 4 is 9---------Last Name: Position 44 

Вот код, который у меня есть. Есть ли способ достичь этого?

package stanley.column.reader; 

import java.io.*; 

public class StanleyColumnReader { 

    public static void main(String[] args) throws IOException { 
     System.out.println("Developed By Stanley Mungai");  
     File f = new File("C:/File/"); 
     if (!f.exists()) { 
      f.createNewFile(); 
     } else { 
      f.delete(); 
     } 
     String [] files = f.list(); 
     for (int j = 0; j < files.length; j++){ 
      FileInputStream fs = new FileInputStream("C:/File/" + files[j]); 
      BufferedReader br = new BufferedReader(new InputStreamReader(fs)); 
      String result = "_result"; 
      BufferedWriter is = new BufferedWriter(new FileWriter("C:/File/" + files[j] + result + ".txt")); 
      for (int i = 0; i < 0; i++) { 
       br.readLine(); 
      } 

      String line = br.readLine(); 
      String[] split = line.split("|"); 
      for (int i = 0; i < split.length; i++) { 
       int k = i + 1; 
       System.out.println("Calculating the size of field " + k); 
       is.write("Column " + k + " is " + split[i].length()); 
       is.flush(); 
       is.newLine(); 
      } 
     } 
     System.out.println("Success"); 
     System.out.println("Output Saved to C:/File"); 
    } 
} 
+0

просто бросить это: если вы собираетесь читать характер разделенных файлов проще использовать CSV-библиотеки как [HTTP://opencsv.sourceforge.net/](http://opencsv.sourceforge.net/) – rotsch

ответ

2

Вы могли бы сделать это с помощью более расширенного соответствия групп регулярных выражений и получить индекс начала группы. Но может быть излишним и слишком продвинутым, учитывая вопрос.

Но быстрый простой способ в вашем случае, который может работать, - это просто использовать indexOf на линии. То есть изменить свой выход включать:

" Position "+(line.indexOf(split[i])+1) 

Покуда фамилии, имени и города не повторяются на одной линии ...

Вы вряд ли нужно промывать в каждой строке кстати, я предлагаю переместить его за пределы цикла.

Регулярное выражение Решение:

//first declare the pattern once in the class 
static final Pattern pattern = Pattern.compile("\\s*(.*?)\\s*\\|"); 
... 
//instead of the split loop: 
String line = "City    |First Name| Second Name|Last Name| Foo |Bar |"; //br.readLine(); 
Matcher matcher = pattern.matcher(line); 
int column = 1; 
while (matcher.find(column == 1 ? 0 : matcher.end())) { 
    String match = matcher.group(1); 
    System.out.println("Column " + column + " is " + match.length() + "---" + match + ": Position " + (matcher.start() + 1)); 
    column++; 
} 

Возможно, в зависимости от точного положения вы хотите, вы можете захотеть изменить (matcher.start()+1) к (matcher.start(1)+1)

+0

'" Позиция "+ (line.indexOf (split [i]) + 1)' - offset на 1 – Subs

+0

Зачем компенсировать 1? Я не вижу определения для позиции, поэтому я бы не знал, но если предположить, что он начинается с индекса 0, если первая позиция равна 1, то добавьте 1 да. –

+0

Строки Java начинаются с индекса 0. OP говорит, что позиция для столбца 1 равна 1. Другое дело, если любые два столбца имеют одинаковое строковое значение, оно вернет позицию 1-го совпадения. – Subs

1

Если я понимаю, что вам нужно. Возможно, вы можете использовать метод indexOf. Это приносит вам первое совпадение. Обнаружив это, измените трубку на что-то другое и снова вызовите pipe indexOf на следующей итерации.

String line = br.readLine(); 
for (int i = 0; i < split.length; i++) { 
     System.out.println("Calculating the position " + line.indexOf("|")); 
     line[line.indexOf("|")] = ","; 
} 
+1

Мне нравится ответ Пульсара, потому что он лаконичен, но, как он упомянул, убедитесь, что у вас нет людей с тем же именем и фамилией. Это что-то общее в Мексике, г-н Пачо Лопес Лопес: p Если вы выберете мое решение, вам понадобятся два разных разделителя, которые никогда не появятся в String. – rsan

+0

Исходные данные: – ErrorNotFoundException

+0

Поля повторяются, поэтому метод не подходит – ErrorNotFoundException

2

Это assignment? Пожалуйста, отметьте его правильно.

Вы не указали, являются ли разделители "|" в данных, но, видя свой код, я предполагаю, что это так.

Что я не понимаю, так это то, как позиция, указанная для столбца 3, равна 31, а столбец 4 - 44? Столбец 3 должен быть 10 + 17 + 1 = 28, а столбец 4 должен быть 10 + 17 + 12 + 1 = 40. Если я ошибаюсь, вам также нужно разместить свои исходные данные.

String[] split = line.split("|"); 
int pos=1; //initial position 
for (int i = 0; i < split.length; i++) { 
    System.out.println("Calculating the size of field " + (i+1)); 
    is.write("Column " + (i+1) + " is " + pos+" : Position "+pos); 
    pos=pos+split[i].length+1; //starting position for next column data 
    is.flush(); 
    is.newLine(); 
} 

Или вы могли бы найти позицию, используя indexOf метод: line.indexOf(split[i])+1

+0

Позиция первого поля будет равна 1, вторая будет длиной поля первого + 1, третьей будет первая длина поля + вторая длина поля +2 из-за | Разделители. – ErrorNotFoundException

+0

Я вижу, я добавил '+ 1' в позицию. В следующий раз, пожалуйста, отправьте исходные данные, чтобы избежать путаницы. – Subs

+0

Также ваша нумерация позиций для столбца 2 равна 18, что неверно. Потому что вы должны добавить 1 для разделителя, и это будет 19. – Subs

Смежные вопросы