Помогите с поиском по csv, пожалуйста
Доброго всем времени суток.
Помогите с поиском по csv, пожалуйста. Есть csv файл со след.данными: 1,Прудников Сергей Анатольевич,672400114230,2308,97,Асс оциация МСРО "Содействие" - Ассоциация "Межрегиональная саморегулируемая организация арбитражных управляющих "Содействие" 2,Овчинников Андрей Валентинович,312000213769,1651,41,Со юз "СРО АУ СЗ" - Союз "Саморегулируемая организация арбитражных управляющих Северо-Запада" 3,Самсонов Вячеслав Алексеевич,521000170811,1629,36,САУ "СРО "ДЕЛО" - Союз арбитражных управляющих "Саморегулируемая организация "ДЕЛО" 4,Овчинников Игорь Евгеньевич,575300927883,1562,82,СРО "ААУ "Паритет" - Саморегулируемая организация "Ассоциация арбитражных управляющих "Паритет" парсю файл - $.ajax({ url: 'au.csv', dataType: 'text', }).done(successFunction); function successFunction(data) { var allRows = data.split(/\r?\n|\r/); var index={ fio:{}, inn:{}, score:{}, sro:{} }; for (var singleRow = 0; singleRow < allRows.length; singleRow++) { var rowCells = allRows[singleRow].split(','); rowCells=allRows[rowCells[0]]={ index : rowCells[0], fio : (rowCells[1] || '').trim(), inn : (rowCells[2] || '').trim(), score : (rowCells[3] || '').trim()+','+(rowCells[4] || '').trim(), sro : (rowCells[5] || '').trim() }; //console.log(rowCells); } } как теперь сделать поиск по фамилии на стороне клиента? чтобы только по фамилии пользователь мог получать все данные об искомом челе из csv файла. а если есть однофамильцы, чтобы выводились и совпадения по фамилии тоже. Плюс в карму гарантирован. Заранее спасибо знатокам. |
Поиск на сервере в файле или фильтрация полученного результата на клиенте?????
|
Мне нужно чтобы пользователь забил фамилию в поиск и получил все что есть на этого чела из csv файла
|
считываешь файл, через fs, потом собираешь массив - 1 строка файла - одна ячейка. получаешь вид массива такой:
let arr = [ ['name' : 'Прудников Сергей Анатольевич', 'hz': '672400114230,2308,97', 'company': 'Асс оциация МСРО "Содействие" - Ассоциация "Межрегиональная саморегулируемая организация арбитражных управляющих "Содействие"']; ... ] И через цикл ищешь совпадения. Все. Работает. |
Это если на сервере обработку делать, ну а если на клиенте, то просто собираешь данные в массив и потом ищешь совпадения. Все. Работает.
Я же спросил, где нужен поиск на сервере или на клиенте. |
считываешь файл, через fs.... сорри. что такое fs?
Как закинуть результат парсинга в массив, если я с объектом работаю? Пользователь ищет искомого только по фамилии, а у меня по вашему получается в массиве сделать полный обход по индексу name, затем регуляркой или как? вытащить совпавшую фамилию.... а если есть однофамильцы? вообще повесится? |
поиск на клиенте.
p.s. поправка - не как а зачем закидывать результат парсинга в массив? чем работа с объектом плоха? |
потому что вы работаете с массивом данных. результат вашего парсинга это массив объектов. В прошлом коменте я не правильно написал, надо так:
let arr = [ {'name' : 'Прудников Сергей Анатольевич', 'hz': '672400114230,2308,97', 'company': 'Асс оциация МСРО "Содействие" - Ассоциация "Межрегиональная саморегулируемая организация арбитражных управляющих "Содействие"'}; ... ] Из этого массива необходимо собрать таблицу наверное или список какой-то, а потом ты подгони код ниже под свой и будет работать. Теперь код, писал правда давно, но я думаю что у вас все получится, смысл такой, что у тебя есть какая-то таблица с данными, типа тех, из файла, ты считываешь событие input на input'е и сравниваешь с тем что у тебя есть. let inputFilterValue = input.value.toLowerCase(); // это то что вводишь в инпут var count = []; // счетчик for (var i = 0;i < data.length;i++) { // data.length - это длинна массивы с данными var cell = deta[i].cells; // что такое cells посмотри сам for (var f = 0; f < cell.length;f++) { if (inputFilterValue.length >= 3) { // поиск только после 3 символов, так лучше if (cell[f].innerHTML.toLowerCase().indexOf(inputFilterValue) > -1) count.push(cell[f]); // сравнение for (var s = 0; s < count.length;s++) { // тут мы оставляем на экране только совпадения count[s].classList.add('find'); count[s].parentNode.setAttribute('data-view', 'true'); } _ELEMENTS.filter.info.innerHTML = (count.length > 0) ? 'Рузультат поиска: ' + count.length : 'Ничего не найдено'; // это если нет результатов поиска , то выводим сообщение, а если нет сам смотри } else { cell[f].parentNode.setAttribute('data-view', 'default'); cell[f].classList.remove('find'); _ELEMENTS.filter.info.innerHTML = ''; count.splice(0, count.length); } } } Я думаю разберешься. Код рабочий, у меня работает |
Простите пожалуйста, но иногда лучше вообще не отвечать, чем так как вы.
Я же черным по белому написал - есть веб страничка на ней инпут со словами - введите фамилию чтобы получить всю инфу о челе. Пользователь вводит фамилию->запрос на сервер->парсим csv->если есть така фамилия - выводим всю инфу об этом челе или людях, если есть совпадения. Пример csv дал, как парсю написал. Попросил - помогите написать скрипт поиска. Что не так??? Зачем кидать общие фразы и код который у вас работает. Мне нужен код который конкретно работает с моими данными а не с вашей табличкой |
Vlad777, если запрашивать сервер (поиск), то тут два варианта:
1) сервер вывалил все данные клиенту, в котором производится поиск - либо нашел, либо нет, более запросы на сервер не будут, все ищется уже в загруженном. 2) вариант - сервер разбил на строки CSV файл (массив), в котором ищет запрошенное - есть ли совпадение подстроки которую ищут в массиве, если да извлекает эти строки возвращая массив (на клиенте это будет массив объектов) Выберите из двух что для вас предпочтительнее. |
Vlad777, ну если так, то флаг вам в руки.
|
Тут мне кажется афтар сам не понимает что ему нужно. Или объяснять не умеет.
|
1 вариант
пусть весь поиск на стороне клиента будет |
афтар объяснять не умеет. этот вариант предпочтительнее
иначе мы долго по личностям проходиться будем |
Я не понимаю что вас не устроило в ответе моем. Вам нужно что бы за вас код написали. Но это уже по желанию каждого. Я вам пытался подсказать куда двигаться.
Суть проблемы, в том, через аякс получаем конкретные данные с сервера после запроса, и все. Либо мы выкидываем все данные изначально и ставим инпут для поиска. После чего ввода символов фильтруем список. Либо это живой поиск, но это уже сложнее. Вот я и говорю что вы сами не понимаете чего хотите. |
Если вы не понимаете о чем я говорю, ну тогда учебник читайте по js. Станет все ясно. Это тривиальная задача решений море в сети.
|
Роман Андреевич, выйдите из моего вопроса и больше не возвращайтесь, пожалуйста.
Я да попросил помощи написать код, т.к. новичок. Прекрасно понимаю что это дело каждого - отвечать мне или нет, поэтому и обратился к тем кто может помочь, а не просто знает куда двигаться. Я вам предпочтительный ответ уже дал. Зная себя честно говорю, лучше считать что афтар плохо объясняет иначе точно сорвусь на личности.... |
:thanks:
|
Роман Андреевич, и вам не хворать
|
На клиенте так на клиенте. Только такой вопрос - откуда этот файл? Если же это действительно CSV, то он с ошибками, корректный будет выглядеть так (например сохраненный в Excel):
1;Прудников Сергей Анатольевич;672400114230;2308;97;"Ас оциация МСРО ""Содействие"" - Ассоциация ""Межрегиональная саморегулируемая организация арбитражных управляющих ""Содействие""" 2;Овчинников Андрей Валентинович;312000213769;1651;41;"С юз ""СРО АУ СЗ"" - Союз ""Саморегулируемая организация арбитражных управляющих Северо-Запада""" 3;Самсонов Вячеслав Алексеевич;521000170811;1629;36;"САУ ""СРО ""ДЕЛО"" - Союз арбитражных управляющих ""Саморегулируемая организация ""ДЕЛО""" 4;Овчинников Игорь Евгеньевич;575300927883;1562;82;"СРО ""ААУ ""Паритет"" - Саморегулируемая организация ""Ассоциация арбитражных управляющих ""Паритет""" Если же это "самопальный" выдаваемый за CSV, то это уже иное. Надо еще заметить, что файл может быть в кодировке cp1251, а сайт работает в utf. Коллизий нет с этой стороны? |
Файл лежит на сервере. Оригинал был Excel - сохранил в csv с помощью OpenOffice, в utf-8, т.к. сайт тоже в utf-8
|
Накидал на коленке, попробуйте.
Если работает, останется только обработчики повесить. new Promise(function(resolve, reject) { $.ajax({ url: 'au.csv', dataType: 'text', success: resolve, error: reject }); }).then(function(response) { const CELL_DELIMITER = ','; return response.split(/\r?\n|\r/).map(function(row) { const cells = row.split(CELL_DELIMITER).map(function(value) { return (value || '').trim(); }); return { index: cells[0], fio: cells[1], inn: cells[2], score: cells[3] + ',' + cells[4], sro: cells[5] }; }); }).then(function(data) { const getFirstChar = function(string) { return (string||'').substr(0, 1).toLowerCase(); }; const indexOfNames = {}; data.forEach(function(person, key) { const firstChar = getFirstChar(person.fio); if(!firstChar) return; (indexOfNames[firstChar] || (indexOfNames[firstChar] = [])).push({ name: person.fio, key: key }); }); return function(name) { name = name.toLowerCase(); const firstChar = getFirstChar(name); if (!indexOfNames[firstChar]) return []; const response = []; indexOfNames[firstChar].forEach(function(item) { if (item.name.indexOf(name) < 0) return; response.push(data[item.key]); }); return response; }; }).then(function(search) { console.log(search('Прудников')); }); |
Nexus,
во-первых, спасибо за ответ! Вот что в консоли пишет - Uncaught (in promise) Object {readyState: 4, responseText: "<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">…was not found on this server.</p></body></html>", status: 404, statusText: "Not Found"} помогите плиз, если не сложно! что конкретно запрос не нашел? и 2 вопрос, а как быть с однофамильцами? можно их как-нибудь тоже обработать для выдачи? |
Nexus, что-то слишком много :)
|
Цитата:
|
Vlad777, написано же, что файл не найден.
Поправьте путь в строке 3. Цитата:
Цитата:
|
Цитата:
|
Nexus,
так частично сам виноват, сорри, по факту файл чуть по другому называется..... еще раз сорри! Но теперь пишет - Uncaught (in promise) TypeError: Cannot read property 'substr' of undefined(…)getFirstChar |
laimas,
да сохраненный файл открыл в нотепад++ - затем копи и вставил сюда |
Цитата:
Цитата:
|
Vlad777, поправил код, попробуйте.
Цитата:
|
Nexus,
согласен конвертация в csv оставляет желать лучшего вы написали что код подправили..... а можно его увидеть? |
или я правильно понял вы его подправили в пером своем посте?
|
если да, то теперь -
Uncaught (in promise) ReferenceError: indexOfnames is not defined(…) |
Vlad777, снова поправил.
https://javascript.ru/forum/misc/761...tml#post499963 laimas, если есть время, посмотрите, пожалуйста, тему: https://javascript.ru/forum/offtopic...ukh-strok.html |
Nexus,
пришел пустой массив но уже нет никаких ошибок |
Цитата:
Загружая файл на сервер, лучше сразу по его приему разобрать сервером (работая именно как с CSV) и сохранить в JSON, который клиент и будет запрашивать. Загружаться этот фал на сервер думаю будет гораздо реже чем запрашиваться клиентами, то есть выгоднее приготовить сразу нужное. При этом выгоднее в нем хранить не разбитые строки, проще будет найти и после нахождения разбить на элементы, если это нужно. Кроме этого, Excel может сохранять и в XML, что еще лучше. |
laimas,
на сервере лежит чистый csv. Я написал что открыл Нотерадом++ только для того. чтобы задать вопрос - для этого часть текста копи-паст сюда. и все. Я сторонник минимизации нагрузки на сервер. Пусть клиент на своей стороне парсит файл и получает(неполучает) ответ. XML может и лучше, но пока здесь в стенку безответности не упрусь буду пробовать |
Между 24 и 25 строками добавьте это и посмотрите, что в консоль выведется:
console.log(data); |
Цитата:
|
Часовой пояс GMT +3, время: 11:04. |