Как я могу исправить свою программу синтаксического анализа машинописных текстов?

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

Пожалуйста, дайте мне знать, если вам нужны какие-либо разъяснения, я сейчас в отчаянии