#javascript #node.js #json #typescript #parsing
Вопрос:
У меня есть текстовый файл, который выглядит аналогично тексту ниже (этот текст повторяется снова и снова с разными номерами вместо просто 200 и 300, с разной информацией для каждого, я просто не добавил все, чтобы сэкономить место).:
**section*
*#section*
$001 EXAM_GO, C_STOP "This failed "
?HELP_NOMO
$002 TEST_GO, C_MOVE "This goes "
?HELP_GOING
*.section*
$200 C_WARN, HELP_NOMO
"One:"amp;new_line
"This is an example " amp;new_line
"Two:"amp;new_line
"This is example two " amp;new_line
$320 C_WARN, HELP_GOING
"One:"amp;new_line
"New example " amp;new_line
"Two:"amp;new_line
"New example two " amp;new_line
**I need to parse it in JSON format look like this:**
{
"number": "200",
"type": "HELP_NOMO",
"message": "This failed",
"one": "This is an example.",
"two:" "This is example two."
}
{
"number": "320",
"type": "HELP_GO"'
"message": "This goes",
"one": "New example.",
"two: "New example two."
}
Ниже приведен код машинописного текста, который у меня есть до сих пор, и я был бы признателен за помощь в том, как получить желаемый вывод JSON!
Я использую клавишу «тип», чтобы отобразить правильные данные до и после «.section». Например, тип первой строки JSON-HELP_NOMO, чтобы получить правильный ключ «сообщение» с другой информацией.
Пожалуйста, не меняйте регулярные выражения (я имею дело с большим количеством текстовых файлов).
Мне нужно избавиться от всех строк, которые начинаются с.,*, # и где написано «amp;new_line».
У меня уже есть асинхронная функция для чтения текстового файла с обещаниями
Пожалуйста, внесите какие-либо изменения, если вы считаете, что у меня должен быть другой подход к этому!
Я знаю, что некоторые синтаксические ошибки неправильны, я очень новичок в этом языке, поэтому не судите
interface Help {
number: string;
type: string;
message: string;
one: string;
two: string;
}
function parseFile(fileContents: string) {
const lines = fileContents.split('n').filter((line) => {
const trimmedLine = line.trim();
return (
!trimmedLine.startsWith('*') || !trimmedLine.startsWith('#') || !trimmedLine.startsWith('.')
);
});
const data = lines;
const map: Record<string, Help> = {};
for (const line of lines) {
const [, number, type, message, one, two ] =
line.match(/^$([0-9]|[1-9][0-9]|[1-9][0-9][0-9])(.*) (. ),(.*)(. )(.*)|t"(. )".*|n|?(. )/) ?? [];
if (!id) {
console.error(`failed to parse "${line}"`);
process.exit(1);
}
map[number] = { number, type, message, one, two };
return data;
}
interface HelpDescription {
type: string;
one: string;
two: string;
}
let go = false;
let descriptor: HelpDescription | null = null;
for (const line of lines) {
if (line.startsWith('$-')) {
go = false;
}
if (!keepGoing) {
const [, type, code] = line.match(/^($|$-|$[0-9]|[1-9][0-9]|[1-9][0-9][0-9])(.*) (. ),(.*)(. )/) || [];
descriptor = { type, one, two: '' }; //how do I get these keys to know what their value is?
map[type] = descriptor;
keepGoing = true;
} else {
if (!descriptor) {
throw new Error('error');
}
if (descriptor.one.two) { //I know this syntax isn't right
descriptor.one.two = 'n';
}
const [, part = ''] = line.match(/^s*"(. )"/) || [];
descriptor.description = part;
}
return map;
}
}
Пожалуйста, дайте мне знать, если вам нужны какие-либо разъяснения, я сейчас в отчаянии