преобразование Excel (xls) файл к запятой разделенный (csv) файл без GUI

Для большого улучшения производительности, альтернативой может быть использование substring() в цикле:

public String[] splitStringEvery(String s, int interval) {
    int arrayLength = (int) Math.ceil(((s.length() / (double)interval)));
    String[] result = new String[arrayLength];

    int j = 0;
    int lastIndex = result.length - 1;
    for (int i = 0; i < lastIndex; i++) {
        result[i] = s.substring(j, j + interval);
        j += interval;
    } //Add the last bit
    result[lastIndex] = s.substring(j);

    return result;
}

Пример:

Input:  String st = "1231241251341351452342352456"
Output: 123 124 125 134 135 145 234 235 245 6.

Это не так коротко, как решение Stevevls , но это намного эффективнее (см. ниже), и я думаю, что в будущем это будет легче отрегулировать, конечно, в зависимости от вашей ситуации.


Тесты производительности (Java 7u45)

2000 символов длинная строка - интервал составляет 3 .

split("(?<=\\G.{" + count + "})") производительность (в миллисекундах):

7, 7, 5, 5, 4, 3, 3, 2, 2, 2

splitStringEvery() (substring()) производительность (в миллисекундах):

2, 0, 0, 0, 0, 1, 0, 1, 0, 0

2 000 000 символов длинная строка - интервал составляет 3 .

split() производительность (в миллисекундах):

207, 95, 376, 87, 97, 83, 83, 82, 81, 83

splitStringEvery() производительность (в миллисекундах):

44, 20, 13, 24, 13, 26, 12, 38, 12, 13

2 000 000 символов длинная строка - интервал составляет 30 .

split() производительность (в миллисекундах):

103, 61, 41, 55, 43, 44, 49, 47, 47, 45

splitStringEvery() производительность (в миллисекундах):

7, 7, 2, 5, 1, 3, 4, 4, 2, 1

Вывод:

Метод splitStringEvery() намного быстрее (даже после изменений в Java 7u6 ), и он обостряется, когда интервалы становятся выше ].

Готовый к использованию тестовый код:

pastebin.com/QMPgLbG9

21
задан Community 23 May 2017 в 11:54
поделиться

9 ответов

Используйте сценарий Perl. Использование модуля Perl Spreadsheet :: ParseExcel из CPAN для анализа файла xls с последующим выводом, поскольку csv должно работать нормально.

http://search.cpan.org/dist/Spreadsheet-ParseExcel

Вы также можете попробовать использовать VBScript.

3
ответ дан 29 November 2019 в 21:50
поделиться

В мире Java вы можете использовать apache poi. Вы можете начать со следующего фрагмента кода Groovy.

FileInputStream fis = new FileInputStream(filename);
Workbook wb = new HSSFWorkbook(fis); 
Sheet sheet = wb.getSheetAt(0);
for (Row row : sheet) {
  for (Cell cell : row) {
    doSomething(cell.toString())
  }

}
4
ответ дан 29 November 2019 в 21:50
поделиться

Используйте одну из переносимых библиотек [Python]:

pyxlreader.sourceforge.net/

sourceforge.net/projects/pyexcelerator

и создайте дополнительный слой сценария на наверху.

2
ответ дан 29 November 2019 в 21:50
поделиться

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

1.) Создайте и откройте соединение с файлом EXCEL, который вы хотите преобразовать в CSV.

2.) Выполните запрос типа «SELECT * From Sheet1», который загрузит все данные Sheet1 в набор записей или в datatable.

3.) Поскольку я использую .net, я могу хранить эти записи на datatable и преобразовать в CSV с помощью следующего метода расширения.

        public static string ToCSV(this DataTable _dataTable)
        {
            StringBuilder csv = new StringBuilder();
            StringWriter sw = new StringWriter(csv);
            int icolcount = _dataTable.Columns.Count;
            for (int i = 0; i < icolcount; i++)
            {
                sw.Write(_dataTable.Columns[i]);
                if (i < icolcount - 1)
                {
                    sw.Write(",");
                }
            }
            sw.Write(sw.NewLine);
            foreach (DataRow drow in _dataTable.Rows)
            {
                for (int i = 0; i < icolcount; i++)
                {
                    if (!Convert.IsDBNull(drow[i]))
                    {
                        sw.Write(drow[i].ToString());
                    }
                    if (i < icolcount - 1)
                    {
                        sw.Write(",");
                    }
                }
                sw.Write(sw.NewLine);
            }
            sw.Close();
            return csv.ToString();
        }

Вы можете применить этот подход к платформа, над которой вы работаете.

Спасибо.

2
ответ дан 29 November 2019 в 21:50
поделиться

Рекомендовать конвертировать XLS: http://www.softinterface.com/Convert-XLS%5CConvert-XLS.htm

«Конвертировать XLS» - это простая в использовании, но сложная утилита конвертера Excel, специально разработанная для Excel, текста и CSV (символьный / через запятую) файлы. Если вам нужно преобразовать / манипулировать одним или тысячами файлов, расположенных в одной или нескольких папках, это инструмент! Преобразование можно выполнять в 10-15 раз быстрее без MS Excel.

Автоматизируйте задачи преобразования Excel с помощью:

  • Встроенного планировщика
  • Командной строки
  • интерфейса COM-интерфейса
0
ответ дан 29 November 2019 в 21:50
поделиться

Если у вас есть Cygwin, скорее всего, у вас будет Python. Если нет - установите python и используйте этот скрипт . Это намного больше, чем вам нужно, но преобразование выполняется легко и быстро.

0
ответ дан 29 November 2019 в 21:50
поделиться

@ Джон Мачин: Я не могу добавить комментарий, так как я новичок в этом форуме :)

Я не использовал старый пакет pyXLreader , но сделал свой пост с учетом xlrd ;)

Я видел он месяц назад, но не использовался в проектах.

WBR

0
ответ дан 29 November 2019 в 21:50
поделиться

Я новичок в этих форумах, и было бы неплохо, если бы они указали год на отметках времени (любимая мозоль), чтобы я знал, сколько лет постам. Я собираюсь предположить, что они из 2009 года.

но хорошее решение в python - использовать xlrd для чтения ваших xls файлов. вот довольно простой вводный урок: http://scienceoss.com/read-excel-files-from-python/ это не мое.

единственная проблема, с которой я столкнулся, были даты в формате Excel. вот быстрое исправление для них:

date = xlrd.xldate_as_tuple (int (sheet.cell (rowNum, colNum) .value), workBookName.datemode)

, чем создать файл csv со встроенным модулем csv, поскольку Я новый пользователь, я могу разместить только одну гиперссылку. но погуглите api модуля csv.

надеюсь, что это было полезно

0
ответ дан 29 November 2019 в 21:50
поделиться

Вы можете использовать xls2csv из пакета catdoc, если вы используете Debian / Ubuntu

6
ответ дан 29 November 2019 в 21:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: