Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Помогите с поиском по csv, пожалуйста (https://javascript.ru/forum/misc/76123-pomogite-s-poiskom-po-csv-pozhalujjsta.html)

Vlad777 07.12.2018 10:10

Помогите с поиском по 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 файла.
а если есть однофамильцы, чтобы выводились и совпадения по фамилии тоже.

Плюс в карму гарантирован. Заранее спасибо знатокам.

Роман Андреевич 07.12.2018 10:26

Поиск на сервере в файле или фильтрация полученного результата на клиенте?????

Vlad777 07.12.2018 10:29

Мне нужно чтобы пользователь забил фамилию в поиск и получил все что есть на этого чела из csv файла

Роман Андреевич 07.12.2018 10:54

считываешь файл, через fs, потом собираешь массив - 1 строка файла - одна ячейка. получаешь вид массива такой:

let arr = [
['name' : 'Прудников Сергей Анатольевич', 'hz': '672400114230,2308,97', 'company': 'Асс оциация МСРО "Содействие" - Ассоциация "Межрегиональная саморегулируемая организация арбитражных управляющих "Содействие"'];
...
]


И через цикл ищешь совпадения. Все. Работает.

Роман Андреевич 07.12.2018 10:56

Это если на сервере обработку делать, ну а если на клиенте, то просто собираешь данные в массив и потом ищешь совпадения. Все. Работает.

Я же спросил, где нужен поиск на сервере или на клиенте.

Vlad777 07.12.2018 11:01

считываешь файл, через fs.... сорри. что такое fs?

Как закинуть результат парсинга в массив, если я с объектом работаю?
Пользователь ищет искомого только по фамилии, а у меня по вашему получается в массиве сделать полный обход по индексу name, затем регуляркой или как? вытащить совпавшую фамилию....
а если есть однофамильцы? вообще повесится?

Vlad777 07.12.2018 11:01

поиск на клиенте.

p.s. поправка - не как а зачем закидывать результат парсинга в массив? чем работа с объектом плоха?

Роман Андреевич 07.12.2018 11:29

потому что вы работаете с массивом данных. результат вашего парсинга это массив объектов. В прошлом коменте я не правильно написал, надо так:

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);
						}

					}

				}


Я думаю разберешься. Код рабочий, у меня работает

Vlad777 07.12.2018 11:45

Простите пожалуйста, но иногда лучше вообще не отвечать, чем так как вы.

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

Что не так???

Зачем кидать общие фразы и код который у вас работает.
Мне нужен код который конкретно работает с моими данными а не с вашей табличкой

laimas 07.12.2018 11:54

Vlad777, если запрашивать сервер (поиск), то тут два варианта:

1) сервер вывалил все данные клиенту, в котором производится поиск - либо нашел, либо нет, более запросы на сервер не будут, все ищется уже в загруженном.

2) вариант - сервер разбил на строки CSV файл (массив), в котором ищет запрошенное - есть ли совпадение подстроки которую ищут в массиве, если да извлекает эти строки возвращая массив (на клиенте это будет массив объектов)

Выберите из двух что для вас предпочтительнее.

Роман Андреевич 07.12.2018 11:54

Vlad777, ну если так, то флаг вам в руки.

Роман Андреевич 07.12.2018 11:55

Тут мне кажется афтар сам не понимает что ему нужно. Или объяснять не умеет.

Vlad777 07.12.2018 11:56

1 вариант
пусть весь поиск на стороне клиента будет

Vlad777 07.12.2018 11:58

афтар объяснять не умеет. этот вариант предпочтительнее

иначе мы долго по личностям проходиться будем

Роман Андреевич 07.12.2018 12:03

Я не понимаю что вас не устроило в ответе моем. Вам нужно что бы за вас код написали. Но это уже по желанию каждого. Я вам пытался подсказать куда двигаться.

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

Вот я и говорю что вы сами не понимаете чего хотите.

Роман Андреевич 07.12.2018 12:05

Если вы не понимаете о чем я говорю, ну тогда учебник читайте по js. Станет все ясно. Это тривиальная задача решений море в сети.

Vlad777 07.12.2018 12:08

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

Роман Андреевич 07.12.2018 12:10

:thanks:

Vlad777 07.12.2018 12:13

Роман Андреевич, и вам не хворать

laimas 07.12.2018 12:43

На клиенте так на клиенте. Только такой вопрос - откуда этот файл? Если же это действительно CSV, то он с ошибками, корректный будет выглядеть так (например сохраненный в Excel):

1;Прудников Сергей Анатольевич;672400114230;2308;97;"Ас оциация МСРО ""Содействие"" - Ассоциация ""Межрегиональная саморегулируемая организация арбитражных управляющих ""Содействие"""
2;Овчинников Андрей Валентинович;312000213769;1651;41;"С юз ""СРО АУ СЗ"" - Союз ""Саморегулируемая организация арбитражных управляющих Северо-Запада"""
3;Самсонов Вячеслав Алексеевич;521000170811;1629;36;"САУ ""СРО ""ДЕЛО"" - Союз арбитражных управляющих ""Саморегулируемая организация ""ДЕЛО"""
4;Овчинников Игорь Евгеньевич;575300927883;1562;82;"СРО ""ААУ ""Паритет"" - Саморегулируемая организация ""Ассоциация арбитражных управляющих ""Паритет"""

Если же это "самопальный" выдаваемый за CSV, то это уже иное. Надо еще заметить, что файл может быть в кодировке cp1251, а сайт работает в utf. Коллизий нет с этой стороны?

Vlad777 07.12.2018 12:47

Файл лежит на сервере. Оригинал был Excel - сохранил в csv с помощью OpenOffice, в utf-8, т.к. сайт тоже в utf-8

Nexus 07.12.2018 12:50

Накидал на коленке, попробуйте.
Если работает, останется только обработчики повесить.
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('Прудников'));
});

Vlad777 07.12.2018 12:57

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 вопрос, а как быть с однофамильцами? можно их как-нибудь тоже обработать для выдачи?

laimas 07.12.2018 12:59

Nexus, что-то слишком много :)

laimas 07.12.2018 13:00

Цитата:

Сообщение от Vlad777
Оригинал был Excel - сохранил в csv

И что сохраненный выглядит так как показано?

Nexus 07.12.2018 13:01

Vlad777, написано же, что файл не найден.
Поправьте путь в строке 3.
Цитата:

Сообщение от laimas
Nexus, что-то слишком много

Чего много?

Цитата:

Сообщение от laimas
И что сохраненный выглядит так как показано?

Excel конвертирует в csv как попало.

Nexus 07.12.2018 13:03

Цитата:

Сообщение от Vlad777
и 2 вопрос, а как быть с однофамильцами? можно их как-нибудь тоже обработать для выдачи?

Вы путь правильный укажите сначала, потому увидите, что с однофамильцами.

Vlad777 07.12.2018 13:03

Nexus,
так частично сам виноват, сорри, по факту файл чуть по другому называется..... еще раз сорри!
Но теперь пишет - Uncaught (in promise) TypeError: Cannot read property 'substr' of undefined(…)getFirstChar

Vlad777 07.12.2018 13:04

laimas,
да сохраненный файл открыл в нотепад++ - затем копи и вставил сюда

laimas 07.12.2018 13:04

Цитата:

Сообщение от Nexus
Чего много?

Кода много :)

Цитата:

Сообщение от Nexus
Excel конвертирует в csv как попало.

Да с чего это вдруг? ;)

Nexus 07.12.2018 13:08

Vlad777, поправил код, попробуйте.

Цитата:

Сообщение от laimas
Да с чего это вдруг?

Это вопрос к его разработчикам, "как попало" - вывод о кач-ве работы на основе моего небольшого опыта конвертации xls в csv.

Vlad777 07.12.2018 13:10

Nexus,
согласен конвертация в csv оставляет желать лучшего

вы написали что код подправили..... а можно его увидеть?

Vlad777 07.12.2018 13:12

или я правильно понял вы его подправили в пером своем посте?

Vlad777 07.12.2018 13:13

если да, то теперь -
Uncaught (in promise) ReferenceError: indexOfnames is not defined(…)

Nexus 07.12.2018 13:13

Vlad777, снова поправил.
https://javascript.ru/forum/misc/761...tml#post499963

laimas, если есть время, посмотрите, пожалуйста, тему:
https://javascript.ru/forum/offtopic...ukh-strok.html

Vlad777 07.12.2018 13:16

Nexus,
пришел пустой массив

но уже нет никаких ошибок

laimas 07.12.2018 13:17

Цитата:

Сообщение от Vlad777
да сохраненный файл открыл в нотепад++ - затем копи и вставил сюда

Ну клиент то будет запрашивать не ваш Notepad, а сервер, который отдаст запрашиваемый файл как есть. Гляньте на его истинное содержание - строки содержащие кавычки в CSV будут заключены в кавычки.

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

Кроме этого, Excel может сохранять и в XML, что еще лучше.

Vlad777 07.12.2018 13:20

laimas,
на сервере лежит чистый csv.
Я написал что открыл Нотерадом++ только для того. чтобы задать вопрос - для этого часть текста копи-паст сюда. и все.

Я сторонник минимизации нагрузки на сервер. Пусть клиент на своей стороне парсит файл и получает(неполучает) ответ.

XML может и лучше, но пока здесь в стенку безответности не упрусь буду пробовать

Nexus 07.12.2018 13:20

Между 24 и 25 строками добавьте это и посмотрите, что в консоль выведется:
console.log(data);

Nexus 07.12.2018 13:22

Цитата:

Сообщение от Vlad777
Я сторонник минимизации нагрузки на сервер. Пусть клиент на своей стороне парсит файл и получает(неполучает) ответ.

Такой себе подход. Вы же осознаете, что клиенту каждый раз нужно будет скачивать ваш csv полностью, перед тем, как начать с ним работать?


Часовой пояс GMT +3, время: 11:04.