Как разделить строку многосимвольным разделителем в InstallScript? (StrGetTokens не работает)

Функция InstallScript StrGetTokens позволяет разделить строку на список. См.: http://helpnet.flexerasoftware.com/installshield20helplib/Subsystems/installshield20langref/Content/helplibrary/LangrefStrGetTokens.htm

Это прекрасно работает с разделителем из одного символа. Кроме того, вы можете указать «набор разделителей», то есть список из 1-символьных разделителей, которые все могут использоваться. Не существует очевидного способа указать многосимвольный разделитель. Я пытался, прежде чем понял, что указанная мной строка будет рассматриваться как этот «набор разделителей» вместо самого разделителя, и столкнулся с очень неожиданными результатами. Должен ли я создавать свой собственный токенизатор или импортировать его и т. д.?


person BuvinJ    schedule 23.12.2015    source источник


Ответы (1)


Я накатил самостоятельно в InstallScript. Вы можете напрямую заменить вызов StrGetTokens этой функцией. Вместо этого он просто обрабатывает параметр «набор разделителей» как многосимвольный разделитель. Хотелось бы лучшего решения...

//prototype NUMBER Tokenize( BYREF LIST, STRING, STRING );
//---------------------------------------------------------------------------
//                                                                           
// Function:  Tokenize
//                                                                           
// Purpose:   Use in place of StrGetTokens when your delimiter is more than 
//            1 character in length
//
// Returns: tokenList is modifed by referrence
//      = 0     Tokenized
//      < 0 Failed to tokenize
//---------------------------------------------------------------------------
function NUMBER Tokenize( tokenList, szDelimitedValues, szDelimiter )
    STRING szReplacementToken, szReplacementTokenPlaceHolder;
    STRING svToken;
    NUMBER nListResult;
begin

    // Clear the return list
    ListDeleteAll( tokenList );

    // Return failure if attempting to tokenize an empty string
    if( szDelimitedValues = "" ) then
        return -1;
    endif;

    // When the delimiter is 0 or 1 chars, just use the native function
    if( StrLength( szDelimiter ) < 2 ) then
        return StrGetTokens( tokenList, szDelimitedValues, szDelimiter );
    endif;

    // Define a 1 character replacement delimiter, and a "placeholder" for it
    szReplacementToken            = "~";
    szReplacementTokenPlaceHolder = "[__TOKEN_PLACEHOLDER__]";

    // Replace all instances of the replacement token with its placeholder
    StrReplace( szDelimitedValues, szReplacementToken, szReplacementTokenPlaceHolder, 0 );

    // Replace all instances of the "real" delimiter with its replacment
    StrReplace( szDelimitedValues, szDelimiter, szReplacementToken, 0 );

    // Tokenize, using the replacement delimiter
    if( StrGetTokens( tokenList, szDelimitedValues, szReplacementToken ) < 0 ) then
        // If this fails, clear the tokenList and return failure
        ListDeleteAll( tokenList );
        return -1;
    endif;

    // Iterate through the token list
    nListResult = ListGetFirstString( tokenList, svToken ); 
    while( nListResult != END_OF_LIST )             

        // For each token,
        // replace all instances of the "placeholder" with the delimiter employed
        // i.e. restore the original value
        StrReplace( svToken, szReplacementTokenPlaceHolder, szReplacementToken, 0 );

        // Update the token in the list with this restored version of it
        if( ListSetCurrentString( tokenList, svToken ) < 0 ) then
            // If this fails, clear the tokenList and return failure
            ListDeleteAll( tokenList );
            return -1;
        endif;      

        nListResult = ListGetNextString( tokenList, svToken ); 
    endwhile; 

end;
person BuvinJ    schedule 23.12.2015