Форум программистов, компьютерный форум, киберфорум
jQuery
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
171 / 170 / 36
Регистрация: 15.01.2014
Сообщений: 1,008
Записей в блоге: 1
1

Парсинг CSV-файла

28.02.2017, 07:03. Показов 3250. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет!

Есть Excel файл, собственно обычный прайс. Вручную (с удалением логотипа, контактов и прочей не-табличной информации) файл приводится к виду обычной таблицы, что-то типа:

Парсинг CSV-файла


Далее файл выгружается на сервер... Как думается, в формате .CSV - проще распарсить такой формат, хотя это лично мое мнение ))

Задача - прочитать по событию файл (нажатие кнопки прайса), для последующей обработки (вывод полученных данных на экран с подстановкой DIV, функциональных кнопок и прочего).

Собственно на этом и завис - как корректнее всего прочитать CSV файл, состоящий из строк, где каждая строка включает себя 6 полей? Некоторые поля (для Вес1... Вес4) могут быть пустые (нет в наличии, не производится).
Читать ли такой в файл в массив, для последующей обработки? Или еще как-то?

Есть еще подзадача... Группировка данных по первому размеру (все товары, начинающиеся с размера 100 мм, потом все товары, начинающиеся с размера 200 мм) - но это уже потом и сам, а пока непонятно как, в каком виде получить данные из файла для удобной дальнейшей обработки.

Размер файла... Около 300-400 подобных строк. Не сказать, что большой, но и точно не маленький. Читал в сети про нагруженность на сервер, его память, процессор при использовании некоторых вариантов библиотек - но тут сильно плаваю, не могу оценить что и как грамотнее, оптимизированно применить. И нужна ли библиотека тут вообще - от формата Excel же уходим, остается текстовый, CSV.

Вот. Спасибо.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.02.2017, 07:03
Ответы с готовыми решениями:

Парсинг CSV (Spine2D *.atlas)
Народ, помогите распарсить кое-какие данные. Есть некий текстовый файл, сразу оговорюсь, что это...

Диаграмма по данным из csv-файла
Здравствуйте, дорогие форумчане:). Подскажите, пожалуйста, с помощью чего мне нарисовать диаграмму...

Парсинг CSV Файла
Помогите пожалуйста написать код парсера для csv файла на objective-C csv файл состоит из 6...

Парсинг CSV файла
Здравствуйте! Помогите пожалуйста, стоит такая задача, нужно сделать парсинг CSV файла, при этом...

3
890 / 725 / 447
Регистрация: 13.07.2015
Сообщений: 2,277
28.02.2017, 09:21 2
PHPExcel используй, получишь массив, из него построишь таблицу уже с помощью javascript
1
171 / 170 / 36
Регистрация: 15.01.2014
Сообщений: 1,008
Записей в блоге: 1
28.02.2017, 22:02  [ТС] 3
Цитата Сообщение от Уф Посмотреть сообщение
PHPExcel используй, получишь массив, из него построишь таблицу уже с помощью javascript
Мгм... Ёмко ))

А хоть как-то подробнее можно про это? Про связку PHP и JS как-то и не думал.
0
890 / 725 / 447
Регистрация: 13.07.2015
Сообщений: 2,277
01.03.2017, 00:11 4
Лучший ответ Сообщение было отмечено Pepeka как решение

Решение

страница для загрузки
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://cdn.datatables.net/1.10.13/js/jquery.dataTables.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.13/css/jquery.dataTables.min.css">
 
<form method="post" enctype="multipart/form-data" style="display:inline;"><input type="file" name="excel" id="excel" accept=".xls, .xlsx"></form>
<button id="btn_upldxls"><span class="btn upl">прочитать</span></button> <select id="xls_list"><option value="0">0</option></select>
 
<b style="cursor: pointer;" onClick="$('#xls_file').toggle();">Содержимое файла</b>
<div style="height:300px; overflow:auto; display: none;" id="xls_file">
<table id="tblXls" class="display compact cell-border" cellpadding="3px" width="100%">
<thead><tr></tr></thead>
<tbody></tbody>
</table>
</div>
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
$('#btn_upldxls').click( function(){ //загрузить из ексель
        $('#xls_file').show();
        var formData = new FormData($('form')[0]);
        formData.append('page', $('#xls_list').val());
        $.ajax({
            type: "POST",
            processData: false,
            contentType: false,
            url: "reader.php",
            data:  formData 
        }).done(function( data ) {
            var prov = JSON.parse(data),
                sellist = '';
            prov.list.forEach(function(item,i,arr){sellist += '<option value="'+i+'">'+item+'</option>';});
            if(sellist != $('#xls_list').html()) $('#xls_list').html(sellist);
            if(dtXls != undefined) { dtXls.fnClearTable(); dtXls.fnDestroy(); }
            $('#tblXls thead tr').html('');
            var dtCfg = {
                "columns" : [],
                "ordering": false,
                "sScrollY": "240px",
                "sDom": "<fi><t>",
                "createdRow": function ( row, data, index ) { var colnum = 0;
                    for(var key in data) {
                        var color = data[key+'color'];
                        if(color != 'FFFFFF') $('td', row).eq(colnum).css('background','#'+color); colnum += 1;
                    }
                }
            };
            var colnum = 0;
            for( var bkey in prov.data[0]) {
                if(bkey.substr(-5)!='color') {
                    dtCfg.columns.push({
                        "data" : bkey,
                        "title" : bkey +'[' + colnum + ']'
                    });
                    colnum += 1;
                }
            }
            dtXls = $('#tblXls').dataTable(dtCfg);
            dtXls.fnAddData(prov.data);
        });
    });
reader.php
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
error_reporting(E_ALL);
set_time_limit(0);
 
$tmp_name = $_FILES["excel"]["tmp_name"];
$name = $_FILES["excel"]["name"];
move_uploaded_file($tmp_name, "/var/www/uploads/bom/".$name);
 
include '../../resources/Classes/PHPExcel/IOFactory.php';
$path = end(explode(".", $name));
if($path == 'xls') $inputFileType = 'Excel5';
if($path == 'xlsx') $inputFileType = 'Excel2007';
$inputFileName = "/var/www/uploads/bom/".$name;
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
//$objReader->setReadDataOnly(true);
$objPHPExcel = $objReader->load($inputFileName);
$worksheetList = $objReader->listWorksheetNames($inputFileName);
$objPHPExcel->setActiveSheetIndex($_POST['page']);
$sheetData = $objPHPExcel->getActiveSheet()->toArray(null,true,true,true);
 
foreach($sheetData as $rk => $row) {
    foreach($row as $ck => $cell) {
        $color = $objPHPExcel->getActiveSheet()->getStyle($ck.$rk)->getFill()->getStartColor()->getRGB();
        $sheetData[$rk][$ck."color"] = str_replace('000000','FFFFFF',$color);
    }
}
 
$lastrow = array_pop($sheetData);
echo '{"data": [';
foreach($sheetData as $row) echo json_encode($row).',';
echo json_encode($lastrow).'], "list": '.json_encode($worksheetList).'}';
это то что я делаю, для отображения результата использую библиотеку DataTables, тебе наверно это не нужно, ты можешь там же в пхп наколдовать групировку строк и прочее колдунство что ты хотел и выплюнуть готовый файл опять в эксель формате, без всяких отображений

Добавлено через 1 минуту
ссылка на либу https://github.com/PHPOffice/PHPExcel

Добавлено через 2 минуты
еще к первой части
Javascript
1
2
3
    $('#xls_list').change(function(){
        $('#btn_upldxls').trigger('click');
    });
это чтобы страницы переключались

Добавлено через 5 минут
если запутаешься я тебе в архиве пришлю все файлы, только залить на сервер и можно играться будет
1
01.03.2017, 00:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.03.2017, 00:11
Помогаю со студенческими работами здесь

Парсинг CSV файла
Привет, я тут чутка джуниор, поэтому хотелось бы узнать как крутые дяди бы сделали эту задачу. ...

Очистка csv файла от мусора - Парсинг
Ребят, нужна помощь, есть csv файл с почти 1000 строк параметров с текстами, больше половины...

Парсинг и загрузка CSV файла в базу данных MYSQL
Есть файл CSV с таким форматом данных: 0,Name0,Name_Trans0,price0,small_text0,big_text0...

Парсинг файла данных производственного календаря в формате csv
Добрый день. Потребовалось получить выходные дни с гос. сайта:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru