Как отобразить зацикливание текста с другой датой - PullRequest
0 голосов
/ 23 апреля 2020

Так что мне нужно собрать данные из моей базы данных, это дата отпуска в моей стране, данные поступают следующим образом.

Example 1 : THU     21    May     Ascension Day of Jesus Christ        *ICDX GOLD open fo
Example 2 : MON-THU 28-31 Dec     Substitute for Commemoration of Idul Fitri Festival

Так что мне нужно получить данные из дат и названия праздника, чтобы получить Данные из примера, я использую код, подобный этому

    String ex1= "THU     21    May     Ascension Day of Jesus Christ        *ICDX GOLD open for"; //i don't need *ICDX so i cut it with trim split
    String ex2= "MON-THU 28-31 Dec     Substitute for Commemoration of Idul Fitri Festival       ";//so i cant cut using substring cause holiday name not fixed length
    String curr = ("CURRENCY IDR"); // to display currency code [hardcoded]
    String dateno = (ex1.substring(8, 13)); // to take date number by substring
    String month = (ex1.substring(14, 17)); // to take month name by substring
    String[] splm = dateno.trim().split("   "); // to trim space after date number
    String dat = (splm[0]); //date number display
    String date= (dat+month+"2020");// display date with year ex1 (21May2020)
    SimpleDateFormat sdf=new SimpleDateFormat("ddMMMyyyy"); //SDF to parse my date format
    SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMdd"); //SDF to new date format
    String comment= (ex1.substring(18, 77)); //Display holidays name by substring
    String[] spl = comment.trim().split("   ");// Trim comment by spaces, so after 3 spaces its cut, like ex1 i dont need *ICDX
    String comm= ("HOLIDAY NAME " +spl[0] +"\r\n"); //Display holiday name

    System.out.println(curr); //sysout currency name
    Date datef;
            try {
               datef = sdf.parse(date);
            System.out.println("DATE " +sdf1.format(datef)); //sysout formatted date

            } catch (ParseException e) {
                e.printStackTrace();
            };
      System.out.println(comm); //sysout holiday name

, и результат получается так:

CURRENCY IDR
DATE 20200521
HOLIDAY NAME Ascension Day of Jesus Christ

Вопрос, если мне нужно сделать это для примера 2 с датой значения 28 От c до 31 * c, и вывод должен быть как в примере 1, и выглядеть так

CURRENCY IDR
DATE 28122020
HOLIDAY NAME Substitute for Commemoration of Idul Fitri Festival

CURRENCY IDR
DATE 29122020
HOLIDAY NAME Substitute for Commemoration of Idul Fitri Festival

CURRENCY IDR
DATE 30122020
HOLIDAY NAME Substitute for Commemoration of Idul Fitri Festival

CURRENCY IDR
DATE 31122020
HOLIDAY NAME Substitute for Commemoration of Idul Fitri Festival

Кто-нибудь имеет представление, какую функцию я должен использовать для отображения такого вывода? я все еще новичок в java, поэтому я приму любой совет, не стесняйтесь комментировать, спасибо

1 Ответ

0 голосов
/ 23 апреля 2020

Как сказал @kofemann, вы можете использовать регулярные выражения. взгляните на следующий код. Обратите внимание, что вы можете изменить регулярное выражение, поскольку полный контекст может отличаться.

public class Main
{
    public static void main(String[] args) {


        final String dayOfTheWeek = "(Mon|Tue|Wed|Thu|Fri|Sat|Sun)(-(Mon|Tue|Wed|Thu|Fri|Sat|Sun))?";
        final String name = "  (\\w{4})[a-z 0-9]+\\b";
        final String Month = "\\ (Jan|Mar|May|Jul|Sep|Sept|Nov|Feb|Apr|Jun|Aug|Oct|Dec)\\ ";
        final String dateNo = "[\\d]+(-[\\d]+)?";

        final String string = "THU     21    May     Ascension Day of Jesus Christ        *ICDX GOLD open fo\n"
             + "MON-THU 28-31 Dec     Substitute for Commemoration of Idul Fitri Festival";

        final Pattern dayOfTheWeekPat = Pattern.compile(dayOfTheWeek, Pattern.MULTILINE | Pattern.CASE_INSENSITIVE);
        final Pattern namePat = Pattern.compile(name, Pattern.MULTILINE | Pattern.CASE_INSENSITIVE);
        final Pattern monthPat = Pattern.compile(Month, Pattern.MULTILINE | Pattern.CASE_INSENSITIVE);
        final Pattern dateNoPat = Pattern.compile(dateNo, Pattern.MULTILINE | Pattern.CASE_INSENSITIVE);

        final Matcher dayOfTheWeekMatcher = dayOfTheWeekPat.matcher(string);
        final Matcher nameMatcher = namePat.matcher(string);
        final Matcher monthMatcher = monthPat.matcher(string);
        final Matcher dateNoMatcher = dateNoPat.matcher(string);
        String curr = ("CURRENCY IDR"); // to display currency code [hardcoded]
        SimpleDateFormat sdf=new SimpleDateFormat("ddMMMyyyy"); //SDF to parse my date format
        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMdd"); //SDF to new date format
        Date datef;

        while (dayOfTheWeekMatcher.find()&&nameMatcher.find()&&monthMatcher.find()&&dateNoMatcher.find()) {
            /*
            System.out.println("date of the week: " + dayOfTheWeekMatcher.group(0).trim());
            System.out.println("name : " + nameMatcher.group(0).trim());
            System.out.println("month " + monthMatcher.group(0).trim());
            System.out.println("date no.: " + dateNoMatcher.group(0).trim());
            */
            String comm = ("HOLIDAY NAME " +nameMatcher.group(0).trim()+"\r\n"); 
            System.out.println(curr);
            String date= (dateNoMatcher.group(0).trim().split("-")[0]+monthMatcher.group(0).trim()+"2020");// display date with year ex1 (21May2020)
             try {
               datef = sdf.parse(date);
               System.out.println("DATE " +sdf1.format(datef)); //sysout formatted date

            } catch (ParseException e) {
                e.printStackTrace();
            };
            System.out.println(comm);
        }

    }
}
...