Changeset 106
- Timestamp:
- Apr 11, 2007, 8:41:25 PM (18 years ago)
- Location:
- trunk/NewView
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/NewView/StringUtilsUnit.pas
r105 r106 17 17 StrLF = chr(10); 18 18 StrCRLF = StrCR + StrLF; 19 Quote = '''';20 DoubleQuote = '"';19 StrSingleQuote = ''''; 20 StrDoubleQuote = '"'; 21 21 22 22 … … 107 107 Function StrInDoubleQuotes(const aString : String) : String; 108 108 109 // Extract all fields in a String delimited by whitespace (blank or tab). 110 // use double quotes if you need blanks in the strings 111 Procedure StrExtractStringsQuoted(Var aResult: TStrings; const aReceiver: String ); 109 112 110 113 Implementation … … 557 560 end; 558 561 562 559 563 Function StrInDoubleQuotes(const aString : String) : String; 560 564 begin 561 Result := DoubleQuote + aString + DoubleQuote; 562 end; 563 564 565 Result := StrDoubleQuote + aString + StrDoubleQuote; 566 end; 567 568 569 Procedure StrExtractStringsQuoted(Var aResult: TStrings; const aReceiver: String ); 570 Var 571 tmpState : (WHITESPACE, INSIDE, START_QUOTE, INSIDE_QUOTED, INSIDE_QUOTED_START_QUOTE); 572 tmpCurrentParsePosition : Integer; 573 tmpCurrentChar : Char; 574 tmpPart : String; 575 576 Begin 577 if (length(aReceiver) < 1) then exit; 578 579 tmpState := WHITESPACE; 580 tmpPart := ''; 581 582 tmpCurrentParsePosition := 1; 583 584 for tmpCurrentParsePosition:=1 to length(aReceiver) do 585 begin 586 tmpCurrentChar := aReceiver[tmpCurrentParsePosition]; 587 588 Case tmpCurrentChar of 589 ' ', StrTAB : 590 begin 591 592 Case tmpState of 593 594 WHITESPACE : 595 begin 596 // nothing 597 end; 598 599 INSIDE : 600 begin 601 aResult.add(tmpPart); 602 tmpPart := ''; 603 tmpState := WHITESPACE; 604 end; 605 606 INSIDE_QUOTED : 607 begin 608 tmpPart := tmpPart + tmpCurrentChar; 609 end; 610 611 START_QUOTE : 612 begin 613 tmpPart := tmpPart + tmpCurrentChar; 614 tmpState := INSIDE_QUOTED; 615 end; 616 617 INSIDE_QUOTED_START_QUOTE : 618 begin 619 aResult.add(tmpPart); 620 tmpPart := ''; 621 tmpState := WHITESPACE; 622 end; 623 end; 624 end; 625 626 StrDoubleQuote : 627 begin 628 629 Case tmpState of 630 631 WHITESPACE : 632 begin 633 tmpState := START_QUOTE; 634 end; 635 636 INSIDE : 637 begin 638 aResult.add(tmpPart); 639 tmpPart := ''; 640 tmpState := START_QUOTE; 641 end; 642 643 INSIDE_QUOTED : 644 begin 645 tmpState := INSIDE_QUOTED_START_QUOTE; 646 end; 647 648 START_QUOTE : 649 begin 650 tmpState := INSIDE_QUOTED_START_QUOTE; 651 end; 652 653 INSIDE_QUOTED_START_QUOTE : 654 begin 655 tmpPart := tmpPart + tmpCurrentChar; 656 tmpState := INSIDE_QUOTED; 657 end; 658 end; 659 end; 660 661 else 662 begin 663 Case tmpState of 664 665 WHITESPACE : 666 begin 667 tmpPart := tmpPart + tmpCurrentChar; 668 tmpState := INSIDE; 669 end; 670 671 INSIDE, INSIDE_QUOTED : 672 begin 673 tmpPart := tmpPart + tmpCurrentChar; 674 end; 675 676 START_QUOTE : 677 begin 678 tmpPart := tmpPart + tmpCurrentChar; 679 tmpState := INSIDE_QUOTED; 680 end; 681 682 INSIDE_QUOTED_START_QUOTE : 683 begin 684 aResult.add(tmpPart); 685 tmpPart := tmpCurrentChar; 686 tmpState := INSIDE; 687 end; 688 end; 689 end; 690 691 end; 692 end; 693 694 Case tmpState of 695 WHITESPACE, START_QUOTE : {nothing to do}; 696 697 INSIDE, INSIDE_QUOTED, INSIDE_QUOTED_START_QUOTE : 698 begin 699 aResult.add(tmpPart); 700 end; 701 end; 702 end; 565 703 END. -
trunk/NewView/unittests/StringUtilsUnitTests.pas
r105 r106 1418 1418 1419 1419 // ---------------------------------------------------------- 1420 1421 1422 PROCEDURE testStrExtractStringsQuoted_Empty; 1423 VAR 1424 tmpResult : TStringList; 1425 tmpString : String; 1426 BEGIN 1427 tmpResult := TStringList.Create; 1428 tmpString := ''; 1429 1430 StrExtractStringsQuoted(tmpResult, tmpString); 1431 assertEqualsInt('testStrExtractStringsQuoted_Empty', 0, tmpResult.count); 1432 1433 tmpResult.Destroy; 1434 END; 1435 1436 1437 PROCEDURE testStrExtractStringsQuoted_OnlyWhitespace; 1438 VAR 1439 tmpResult : TStringList; 1440 tmpString : String; 1441 BEGIN 1442 tmpResult := TStringList.Create; 1443 tmpString := ' ' + StrTAB + ' '; 1444 1445 StrExtractStringsQuoted(tmpResult, tmpString); 1446 assertEqualsInt('testStrExtractStringsQuoted_OnlyWhitespace', 0, tmpResult.count); 1447 1448 tmpResult.Destroy; 1449 END; 1450 1451 1452 PROCEDURE testStrExtractStringsQuoted_OnlyText; 1453 VAR 1454 tmpResult : TStringList; 1455 tmpString : String; 1456 BEGIN 1457 tmpResult := TStringList.Create; 1458 tmpString := 'TeXt'; 1459 1460 StrExtractStringsQuoted(tmpResult, tmpString); 1461 assertEqualsInt('testStrExtractStringsQuoted_OnlyText', 1, tmpResult.count); 1462 assertEqualsString('testStrExtractStringsQuoted_OnlyText', 'TeXt', tmpResult[0]); 1463 1464 tmpResult.Destroy; 1465 END; 1466 1467 1468 PROCEDURE testStrExtractStringsQuoted_OnlyText2Parts; 1469 VAR 1470 tmpResult : TStringList; 1471 tmpString : String; 1472 BEGIN 1473 tmpResult := TStringList.Create; 1474 tmpString := 'TeXt sample'; 1475 1476 StrExtractStringsQuoted(tmpResult, tmpString); 1477 assertEqualsInt('testStrExtractStringsQuoted_OnlyText2Parts', 2, tmpResult.count); 1478 assertEqualsString('testStrExtractStringsQuoted_OnlyText2Parts', 'TeXt', tmpResult[0]); 1479 assertEqualsString('testStrExtractStringsQuoted_OnlyText2Parts', 'sample', tmpResult[1]); 1480 1481 tmpResult.Destroy; 1482 END; 1483 1484 1485 PROCEDURE testStrExtractStringsQuoted_TextAndWhitespace2Parts; 1486 VAR 1487 tmpResult : TStringList; 1488 tmpString : String; 1489 BEGIN 1490 tmpResult := TStringList.Create; 1491 tmpString := ' TeXt ' + StrTAB + StrTAB + ' sample ' + StrTAB; 1492 1493 StrExtractStringsQuoted(tmpResult, tmpString); 1494 assertEqualsInt('testStrExtractStringsQuoted_TextAndWhitespace2Parts', 2, tmpResult.count); 1495 assertEqualsString('testStrExtractStringsQuoted_TextAndWhitespace2Parts', 'TeXt', tmpResult[0]); 1496 assertEqualsString('testStrExtractStringsQuoted_TextAndWhitespace2Parts', 'sample', tmpResult[1]); 1497 1498 tmpResult.Destroy; 1499 END; 1500 1501 1502 PROCEDURE testStrExtractStringsQuoted_QuotedText1Part; 1503 VAR 1504 tmpResult : TStringList; 1505 tmpString : String; 1506 BEGIN 1507 tmpResult := TStringList.Create; 1508 tmpString := '"TeXt"'; 1509 1510 StrExtractStringsQuoted(tmpResult, tmpString); 1511 assertEqualsInt('testStrExtractStringsQuoted_QuotedText1Part', 1, tmpResult.count); 1512 assertEqualsString('testStrExtractStringsQuoted_QuotedText1Part', 'TeXt', tmpResult[0]); 1513 1514 tmpResult.Destroy; 1515 END; 1516 1517 1518 PROCEDURE testStrExtractStringsQuoted_QuotedText1PartNoClosingQuotes; 1519 VAR 1520 tmpResult : TStringList; 1521 tmpString : String; 1522 BEGIN 1523 tmpResult := TStringList.Create; 1524 tmpString := '"TeXt'; 1525 1526 StrExtractStringsQuoted(tmpResult, tmpString); 1527 assertEqualsInt('testStrExtractStringsQuoted_QuotedText1PartNoClosingQuotes', 1, tmpResult.count); 1528 assertEqualsString('testStrExtractStringsQuoted_QuotedText1PartNoClosingQuotes', 'TeXt', tmpResult[0]); 1529 1530 tmpResult.Destroy; 1531 END; 1532 1533 1534 PROCEDURE testStrExtractStringsQuoted_QuotedText1PartNoClosingQuotesWhitewspace; 1535 VAR 1536 tmpResult : TStringList; 1537 tmpString : String; 1538 BEGIN 1539 tmpResult := TStringList.Create; 1540 tmpString := '"TeX t '; 1541 1542 StrExtractStringsQuoted(tmpResult, tmpString); 1543 assertEqualsInt('testStrExtractStringsQuoted_QuotedText1PartNoClosingQuotesWhitewspace', 1, tmpResult.count); 1544 assertEqualsString('testStrExtractStringsQuoted_QuotedText1PartNoClosingQuotesWhitewspace', 'TeX t ', tmpResult[0]); 1545 1546 tmpResult.Destroy; 1547 END; 1548 1549 1550 1551 1552 PROCEDURE testStrExtractStringsQuoted_QuotedText1PartQuoteInside; 1553 VAR 1554 tmpResult : TStringList; 1555 tmpString : String; 1556 BEGIN 1557 tmpResult := TStringList.Create; 1558 tmpString := '"TeX"t'; 1559 1560 StrExtractStringsQuoted(tmpResult, tmpString); 1561 assertEqualsInt('testStrExtractStringsQuoted_QuotedText1PartQuoteInside', 2, tmpResult.count); 1562 assertEqualsString('testStrExtractStringsQuoted_QuotedText1PartQuoteInside', 'TeX', tmpResult[0]); 1563 assertEqualsString('testStrExtractStringsQuoted_QuotedText1PartQuoteInside', 't', tmpResult[1]); 1564 1565 tmpResult.Destroy; 1566 END; 1567 1568 1569 PROCEDURE testStrExtractStringsQuoted_QuotedText1Part2QuotesInside; 1570 VAR 1571 tmpResult : TStringList; 1572 tmpString : String; 1573 BEGIN 1574 tmpResult := TStringList.Create; 1575 tmpString := '"TeX""t"'; 1576 1577 StrExtractStringsQuoted(tmpResult, tmpString); 1578 assertEqualsInt('testStrExtractStringsQuoted_QuotedText1Part2QuotesInside', 1, tmpResult.count); 1579 assertEqualsString('testStrExtractStringsQuoted_QuotedText1Part2QuotesInside', 'TeX"t', tmpResult[0]); 1580 1581 tmpResult.Destroy; 1582 END; 1583 1584 1585 PROCEDURE testStrExtractStringsQuoted_QuotedText1Part2Quotes; 1586 VAR 1587 tmpResult : TStringList; 1588 tmpString : String; 1589 BEGIN 1590 tmpResult := TStringList.Create; 1591 tmpString := '"""Te X""t"""'; 1592 1593 StrExtractStringsQuoted(tmpResult, tmpString); 1594 assertEqualsInt('testStrExtractStringsQuoted_QuotedText1Part2Quotes', 1, tmpResult.count); 1595 assertEqualsString('testStrExtractStringsQuoted_QuotedText1Part2Quotes', '"Te X"t"', tmpResult[0]); 1596 1597 tmpResult.Destroy; 1598 END; 1599 1600 1601 PROCEDURE testStrExtractStringsQuoted_Only1Quote; 1602 VAR 1603 tmpResult : TStringList; 1604 tmpString : String; 1605 BEGIN 1606 tmpResult := TStringList.Create; 1607 tmpString := '"'; 1608 1609 StrExtractStringsQuoted(tmpResult, tmpString); 1610 assertEqualsInt('testStrExtractStringsQuoted_Only1Quote', 0, tmpResult.count); 1611 1612 tmpResult.Destroy; 1613 END; 1614 1615 1616 PROCEDURE testStrExtractStringsQuoted_Only1QuoteAndWhitespace; 1617 VAR 1618 tmpResult : TStringList; 1619 tmpString : String; 1620 BEGIN 1621 tmpResult := TStringList.Create; 1622 tmpString := ' " '; 1623 1624 StrExtractStringsQuoted(tmpResult, tmpString); 1625 assertEqualsInt('testStrExtractStringsQuoted_Only1QuoteAndWhitespace', 1, tmpResult.count); 1626 assertEqualsString('testStrExtractStringsQuoted_Only1QuoteAndWhitespace', ' ', tmpResult[0]); 1627 1628 tmpResult.Destroy; 1629 END; 1630 1631 1632 PROCEDURE testStrExtractStringsQuoted_QuoteStartsNewPart; 1633 VAR 1634 tmpResult : TStringList; 1635 tmpString : String; 1636 BEGIN 1637 tmpResult := TStringList.Create; 1638 tmpString := 'ab"c"'; 1639 1640 StrExtractStringsQuoted(tmpResult, tmpString); 1641 assertEqualsInt('testStrExtractStringsQuoted_QuoteStartsNewPart', 2, tmpResult.count); 1642 assertEqualsString('testStrExtractStringsQuoted_QuoteStartsNewPart', 'ab', tmpResult[0]); 1643 assertEqualsString('testStrExtractStringsQuoted_QuoteStartsNewPart', 'c', tmpResult[1]); 1644 1645 // note this is not compatible with the old behavior but more consistent 1646 // tmpIndex := 1; 1647 // GetNextQuotedValue(tmpString, tmpIndex, s, '"'); 1648 // assertEqualsString('testGetNextQuotedValue', 'ab"c"', s); 1649 1650 tmpResult.Destroy; 1651 END; 1652 1653 1654 PROCEDURE testStrExtractStringsQuoted_ManyParts; 1655 VAR 1656 tmpResult : TStringList; 1657 tmpString : String; 1658 BEGIN 1659 tmpResult := TStringList.Create; 1660 tmpString := 'ab "c" """d" xy z ""'; 1661 1662 StrExtractStringsQuoted(tmpResult, tmpString); 1663 assertEqualsInt('testStrExtractStringsQuoted_ManyParts', 6, tmpResult.count); 1664 assertEqualsString('testStrExtractStringsQuoted_ManyParts', 'ab', tmpResult[0]); 1665 assertEqualsString('testStrExtractStringsQuoted_ManyParts', 'c', tmpResult[1]); 1666 assertEqualsString('testStrExtractStringsQuoted_ManyParts', '"d', tmpResult[2]); 1667 assertEqualsString('testStrExtractStringsQuoted_ManyParts', 'xy', tmpResult[3]); 1668 assertEqualsString('testStrExtractStringsQuoted_ManyParts', 'z', tmpResult[4]); 1669 assertEqualsString('testStrExtractStringsQuoted_ManyParts', '', tmpResult[5]); 1670 1671 tmpResult.Destroy; 1672 END; 1673 1674 1675 // ---------------------------------------------------------- 1676 1420 1677 1421 1678 … … 1562 1819 result.add(@testStrInDoubleQuotes_Empty); 1563 1820 result.add(@testStrInDoubleQuotes); 1821 1822 result.add(@testStrExtractStringsQuoted_Empty); 1823 result.add(@testStrExtractStringsQuoted_OnlyWhitespace); 1824 result.add(@testStrExtractStringsQuoted_OnlyText); 1825 result.add(@testStrExtractStringsQuoted_OnlyText2Parts); 1826 result.add(@testStrExtractStringsQuoted_TextAndWhitespace2Parts); 1827 result.add(@testStrExtractStringsQuoted_QuotedText1Part); 1828 result.add(@testStrExtractStringsQuoted_QuotedText1PartNoClosingQuotes); 1829 result.add(@testStrExtractStringsQuoted_QuotedText1PartNoClosingQuotesWhitewspace); 1830 result.add(@testStrExtractStringsQuoted_QuotedText1PartQuoteInside); 1831 result.add(@testStrExtractStringsQuoted_QuotedText1Part2QuotesInside); 1832 result.add(@testStrExtractStringsQuoted_QuotedText1Part2Quotes); 1833 result.add(@testStrExtractStringsQuoted_Only1Quote); 1834 result.add(@testStrExtractStringsQuoted_Only1QuoteAndWhitespace); 1835 result.add(@testStrExtractStringsQuoted_QuoteStartsNewPart); 1836 result.add(@testStrExtractStringsQuoted_ManyParts); 1837 1564 1838 END; 1565 1839
Note:
See TracChangeset
for help on using the changeset viewer.