2013-04-19 3 views
2

Я использую Google гуавы для форматирования строк и записать их в текстовый файл с помощью BufferedWriterИспользование Google Guava для форматирования строк

import com.google.common.base.Strings; 
import java.io.*; 

public class Test { 

    public static void main(String[] args) { 
     File f = new File("MyFile.txt"); 
     String firstName = "STANLEY"; 
     String secondName = "GATUNGO"; 
     String thirdname = "MUNGAI"; 
     String location = "NAIROBI"; 
     String school = "STAREHE BOYS CENTRE"; 
     String yob= "1970"; 
     String marital = "MARIED"; 
     String texture = "LIGHT"; 

     try { 
      BufferedWriter bw = new BufferedWriter(new FileWriter(f)); 
      if (!f.exists()) { 
       f.createNewFile(); 
      } 
      bw.write(Strings.padStart(firstName, 0, ' ')); 
      bw.write(Strings.padStart(secondName, 20, ' ')); 
      bw.write(Strings.padStart(thirdname, 20, ' ')); 
      bw.write(Strings.padStart(location, 20, ' ')); 
      bw.newLine(); 
      bw.write(Strings.padStart(school, 0, ' ')); 
      bw.write(Strings.padStart(yob, 20, ' ')); 
      bw.write(Strings.padStart(marital, 20, ' ')); 
      bw.write(Strings.padStart(texture, 20, ' ')); 


      bw.close(); 
     } catch (Exception asd) { 
      System.out.println(asd); 
     } 
    } 
} 

Мой Выход My output

Мне нужен выход, чтобы быть

Desired Output

Я получаю строки из базы данных и базы данных и жесткого кодирования Выше всего один пример, мне нужно написать строки так, чтобы длина первой строки не влияла на начальную позицию второй строки. Мне нужно написать их в «Колонном манере», все из которых берутся за ту же позицию с помощью Google Guava. Я также буду оценивать примеры.

ответ

5

String.format

Вы можете просто использовать String.format() вместо Guava. Он следует за C printf синтаксис described here. Я думаю, что это отвечает вашим потребностям.

String aVeryLongString="aaabbbcccdddeeefffggghh"; 
String aShortString="abc"; 
String anotherString="helloWorld"; 

String formattedString=String.format("%5.5s,%5.5s,%5.5s",aVeryLongString,aShortString,anotherString); 

System.out.println(formattedString); 

Выход:

aaabb, abc,hello 

Как вы можете видеть, длинная строка была вырезана и короткая строка была дополнена.

+0

Спасибо. Выполнено так: 'bw.write (String.format ("% - 20.20s% -20.20s% -20.20s% -20.20s% -20.20s ", firstName, secondName, thirdName, location));' Ваша идея Конечно – ErrorNotFoundException

2

Я не уверен, что вы можете это сделать, хотя я не использовал Google Guava. Вот предложение, напишите файлы в CSV-файл, разделенный запятыми. Для этого просто измените свой вывод на MyFile.csv, затем добавьте запятую «,» после каждого значения, которое вы пишете. Этот файл можно открыть в любой программе Spreadsheet с каждым значением в своей собственной ячейке, поэтому решение будет аккуратным.

Если это не сработает, то есть, если это должен быть txt-файл, вот еще одна идея. Проведите тщательную проверку каждой строки, которую вы должны написать, найдите самую длинную, а затем настройте каждую другую строку, которая у вас есть на эту длину, добавив к ней пробел.

Надеюсь, это поможет!

2

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

Вы должны всегда знать максимальный размер строки в одной строке. Я расчета здесь только один на самом деле:

private static final class SortBylenght extends Ordering<String>{ 
     @Override 
     public int compare(String left, String right) { 
      return Ints.compare(left.length(), right.length()); 
     } 
    } 

Затем рассчитать макс:

ImmutableList<String> data = ImmutableList.of(firstName, school); 
    SortBylenght sortBylenght = new SortBylenght(); 
    String maxString = sortBylenght.max(data); 
    int maxSize = maxString.length(); 

Затем распечатайте:

bw.write(Strings.padEnd(firstName, maxSize, ' ')); 
    for(int i=0;i<20;++i) bw.write(' '); 
    //You need to pad the end here of course again like in the first row; 
    bw.write(secondName); 
    bw.newLine(); 
    bw.write(Strings.padEnd(school, maxSize, ' ')); 
    for(int i=0;i<20;++i) bw.write(' '); 
    //You need to pad the end here of course again like in the first row; 
    bw.write(yob); 
+1

Главное здесь - использовать 'padEnd()', _not_ 'padStart()' для формата с фиксированным столбцом. –

1

Использование padEnd(), не padStart(). padStart() было бы, если бы вы хотели выровнять столбцы справа.

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