У меня есть список email-адресов в CSV-файле, по которому я раздаю значки. Я ожидал, что некоторые пользователи не будут найдены на форуме (я использую список всех участников мероприятия, и не у всех из них есть аккаунт на форуме). Вроде всё работало: многие были найдены без проблем, но я заметил, что один человек, который должен был получить значок, не получил его.
Я протестировал процесс ещё раз, используя только его email-адрес в CSV, и он всё равно не был сопоставлен с существующим пользователем.
Для одного примера я мог бы это сделать, но так как у меня есть список из тысяч электронных адресов, а не имён пользователей, это не масштабируется на всех остальных.
Эти предупреждения не связаны с вашей проблемой. Их видит каждый, кто не настроил лицензионный ключ MaxMind. Поскольку люди тратят время на расследование этих предупреждений, когда сталкиваются с другими проблемами, я хотел их отключить. Однако мой коммит был отменён, так как он сломал некоторые другие тесты CI и среды разработки. Это нужно переделать другим способом.
Что касается вашей проблемы, вот соответствующие блоки кода:
Я не вижу очевидной ошибки, но я также не программист на Ruby. Я протестировал это на нашем экземпляре с одним и двумя адресами электронной почты в простом CSV-файле с разделителями-запятыми, и всё работало. Это также работало независимо от того, использовал ли я окончания строк LF или CRLF, просто чтобы исключить некоторые распространённые проблемы с парсерами файлов. Как вы создаёте CSV-файл, и выглядит ли он нормально, когда вы открываете его в простом текстовом редакторе, например, notepad, nano, vi или любом другом?
Отлично, спасибо за помощь. Я тоже так думал насчёт предупреждения MaxMind, но вчера у меня было время лишь бегло ознакомиться с ним перед выходом из системы.
Файл CSV генерируется в Salesforce, и в каждой строке содержится один адрес электронной почты без запятых или пробелов. Когда я вставляю его в обычный текстовый редактор, всё выглядит абсолютно нормально: никаких лишних символов и прочего. Я также пробовал с новым CSV-файлом, содержащим один адрес электронной почты, но получил ту же ошибку.
Строго говоря, это не CSV, что означает «значения, разделённые запятыми» . Однако я знаю, что расширение файла широко используется и с другими разделителями. Более того, переносы строк часто служат разделителями наборов данных, поэтому один адрес электронной почты на строку должен работать — и, кстати, здесь он работает.
На самом деле вчера я провёл неправильный тест, так как сначала добавил действительный адрес электронной почты, а затем недопустимый. Я думал, что система просто молча пропускает несуществующие адреса, но на самом деле она обрабатывает только первую запись в каждой строке, поэтому не допускает нескольких адресов электронной почты на одной строке. Код это вполне ясно демонстрирует:
line = CSV.parse_line(line).first&.strip
Затем вся строка line добавляется как одна запись электронной почты или имени пользователя для сопоставления.
Когда я добавил несколько адресов электронной почты в одну строку, смешав действительные и недопустимые, система показала правильное количество успешно применённых пакетов и перечислила все адреса, которые не удалось сопоставить. Тестирование проводилось снова с переносами строк Windows и UNIX:
Однако проблема не в многострочности или множественных значениях, если система не работает даже с первым адресом электронной почты, хотя он корректен . Не уверен, как легко отладить проблему без пересборки экземпляра Discourse. Вы используете официальный установщик Docker-образа?
РЕДАКТИРОВАНИЕ: Ха-ха, подпись к изображению была добавлена каким-то ИИ на немецком языке, по крайней мере, здесь, в моём браузере с немецкой локалью. Очень подробно и абсолютно верно .
Я перепроверю это с нашей IT-командой — именно они всё настраивали, поэтому я точно не уверен, что это работает через Docker.
Также немного странное обновление… Кажется, я решил проблему, но не понимаю ни почему, ни как.
Вот моя текущая цепочка событий:
Исходный файл был в формате .xlsx, скачанный из Salesforce; я сохранил его как CSV — это не присвоило значок моему тестовому пользователю, но с другими работало.
Я протестировал с одним адресом электронной почты в новом CSV-файле — это тоже не сработало.
Я попробовал несколько способов очистки данных — именно тогда начали появляться ошибки 502, и письма перестали отправляться. Возможно, я случайно добавил лишние пустые поля или что-то странное, из-за чего файл стал слишком большим и не мог быть распарсен, отсюда и (новая) ошибка 502.
Вставка адресов из того же CSV в новый, чистый файл, похоже, решила проблему — мой тестовый пользователь получил значок!
… и, возможно, самая странная часть: только у него отсутствовал значок?! Я не уверен, что полностью верю в это, поскольку маловероятно, что проблема затронула только его адрес и ни чей-либо ещё. Если это имеет значение, его адрес был первым в файле.
В противном случае, может быть, он просто проклят?
Отлично, что вы решили проблему. Вероятно, внутрь попал какой-то специальный символ, например, кавычки в “test” и "test" здесь на Discourse, из-за чего символы двойных кавычек различаются, несмотря на то, что я вводил их одинаково.
В коде Discourse для этого CSV-файла установлен лимит в 50 000 записей; возможно, его можно изменить через конфигурацию. Однако, думаю, строк было меньше 50 000? Вероятно, у самого парсера или даже у веб-сервера есть другие, более низкие ограничения по размеру или количеству символов.
Кстати, вы можете просто передать новый CSV-файл со всеми адресами электронной почты (включая исправленный) в функцию массовой выдачи значков, и она покажет результаты так, будто все значки были назначены заново. Так вы сможете проверить и убедиться, что действительно все остальные получили их.