Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Java] CSV файлы в файлы с полями фикс. ширины


Автор: kornata 7.4.2010, 12:31
Помогите мне выполнить задание. Трудности с переводом.


Создайте программу, которая переводит CSV файлы в файлы с полями фиксированной ширины. Аргументы программы: имя входного файла, имя выходного файла, список длин полей. Во входном файле поля разделены запятыми, каждая строка - отдельная запись. В выходном файле должны появиться те же самые записи, по одной в строку, но без разделителя полей, поля должны быть заданной ширины, значения дополнены пробелами до длины поля, строковые значения выравнениы по левому краю, численные - по правому. 

Автор: kornata 18.4.2010, 12:27
Кто мне может помочь?

Автор: LSD 20.4.2010, 18:35
Сторонние библиотеки можно использовать?

Автор: kornata 20.4.2010, 18:38
Это какие?

Автор: kornata 20.4.2010, 21:08
Вот я кое-что сделала: 

Код

import java.io.*;
import java.util.*;
  public class csv extends ArrayList<String> {
  // Read a file as a single string and formatize this string for a new File:
  public static String read(String fileName, String... args) {
    StringBuilder sb = new StringBuilder();
    try {
      BufferedReader in= new BufferedReader(new FileReader(
        new File(fileName).getAbsoluteFile()));
    try {
        String s;
        while((s = in.readLine()) != null) {
        String formatise = ""; // @formatise - param for String.format method
        int i =1;
        ArrayList<String> sArr = new ArrayList<String>();
        /* split a String */
        StringTokenizer st = new StringTokenizer(s,",");
            while (st.hasMoreTokens()) {
                sArr.add(st.nextToken());
                /* generate @formatise*/
                try {
                    formatise = formatise +"%"+ Integer.toString(i) + "$" +"-" + (args[i-1])+"s"+ " ";
                } catch(ArrayIndexOutOfBoundsException e) {
                   System.out.println("It is not enough parameters");
                   throw new RuntimeException(e);
                }
                 i++;
            }
            /* Create String with new formatization */
            String s2 = String.format(formatise, sArr.toArray() );
            sb.append(s2);
            sb.append("\n");
        }
      } finally {
        in.close();
      }
    } catch(IOException e) {
      throw new RuntimeException(e);
    }
    return sb.toString();
  }
  // Write a New file
  public static void write(String fileName, String text) {
    try {
      PrintWriter out = new PrintWriter(
        new File(fileName).getAbsoluteFile());
      try {
        out.print(text);
      } finally {
        out.close();
      }
    } catch(IOException e) {
      throw new RuntimeException(e);
    }
  }
    public static void main(String args[]) {
    /*Separate fields width from args[]*/
    String[] args1 = new String[args.length-2];
    for (int i = 2; i<args.length; i++) {
        args1[i-2] = args[i];
        }
    String file = read(args[0] ,args1);
    System.out.println(file);
   
  }
}



Вот тут ругается на catch. 

Код

 public static void write(String fileName, String text) {
    try {
      PrintWriter out = new PrintWriter(
        new File(fileName).getAbsoluteFile());
      try {
        out.print(text);
      } finally {
        out.close();
      }
    } catch(IOException e) {
      throw new RuntimeException(e);
    }
  }

Автор: kornata 20.4.2010, 21:27
Вот что пишет Нетбинс:

Автор: LSD 21.4.2010, 12:56
Цитата(kornata @  20.4.2010,  19:38 Найти цитируемый пост)
Это какие?

http://opencsv.sourceforge.net/
Код

import au.com.bytecode.opencsv.CSVReader;

import java.io.*;

public class CSVProcessor
{
  public static void main(String[] args)
  {
    process(new File("C:\\TEMP\\Sample.csv"), new File("C:\\TEMP\\Sample.txt"), 50);
  }

  public static void process(File inFile, File outFile, int width)
  {
    CSVReader csvReader = null;
    PrintWriter writer = null;
    try
    {
      writer = new PrintWriter(outFile);
      csvReader = new CSVReader(new FileReader(inFile), ',', '"');
      String[] line;
      while((line = csvReader.readNext()) != null)
      {
        for(String col : line)
        {
          writer.write(pad(col, width));
        }
        writer.println();
      }
    }
    catch(IOException e)
    {
      e.printStackTrace();
    }
    finally
    {
      close(csvReader);
      close(writer);
    }
  }

  private static String pad(String col, int width)
  {
    col = col.trim();
    if(isNumber(col))
    {
      return padRight(col, width);
    }
    else
    {
      return padLeft(col, width);
    }
  }

  private static String padRight(String col, int width)
  {
    if(col.length() > width)
    {
      return ' ' + col.substring(0, width) + ' ';
    }
    else
    {
      StringBuilder buffer = new StringBuilder(width + 2);
      buffer.append(' ');
      int i = width - col.length();
      while(i > 0)
      {
        buffer.append(' ');
        i--;
      }
      buffer.append(col);
      buffer.append(' ');
      return buffer.toString();
    }
  }

  private static String padLeft(String col, int width)
  {
    if(col.length() > width)
    {
      return ' ' + col.substring(0, width) + ' ';
    }
    else
    {
      StringBuilder buffer = new StringBuilder(width + 2);
      buffer.append(' ');
      buffer.append(col);
      int i = width - col.length();
      while(i > 0)
      {
        buffer.append(' ');
        i--;
      }
      buffer.append(' ');
      return buffer.toString();
    }
  }

  private static boolean isNumber(String col)
  {
    try
    {
      Double.parseDouble(col);
      return true;
    }
    catch(NumberFormatException e)
    {
      return false;
    }
  }

  private static void close(Closeable closeable)
  {
    try
    {
      if(closeable != null)
      {
        closeable.close();
      }
    }
    catch(IOException e)
    {
      e.printStackTrace();
    }
  }
}


Автор: kornata 21.4.2010, 13:05
Мне кажется нельзя, а почему у меня ошибка в catch? Как её исправить?

Автор: kornata 21.4.2010, 13:41
LSD,  у меня ваш код не работает. Текстовый файл пустой и в Нетбинсе:

Exception in thread "main" java.lang.RuntimeException: Uncompilable source code
        at javaita.CSV.process(csv.java:21)
        at javaita.CSV.main(csv.java:13)
Java Result: 1

Автор: LSD 21.4.2010, 16:21
Цитата(kornata @  21.4.2010,  14:05 Найти цитируемый пост)
Мне кажется нельзя, а почему у меня ошибка в catch? Как её исправить?

Нет там никаких ошибок, это у тебя NetBeans глючит. IOException там действительно нет, но есть FileNotFoundException который унаследован от IOException.



Цитата(kornata @  21.4.2010,  14:41 Найти цитируемый пост)
LSD,  у меня ваш код не работает. Текстовый файл пустой и в Нетбинсе:

Exception in thread "main" java.lang.RuntimeException: Uncompilable source code
        at javaita.CSV.process(csv.java:21)
        at javaita.CSV.main(csv.java:13)
Java Result: 1

Это какая-то внутренняя ошибка NetBeans. У меня все работает.


Попробуй компилировать код в командной строке или в другой IDE.

Автор: kornata 25.4.2010, 18:23
Спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)