Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [PHP] błędy w generowaniu csv
neurogen
post 1.06.2018, 22:35:50
Post #1





Grupa: Zarejestrowani
Postów: 58
Pomógł: 0
Dołączył: 25.03.2018

Ostrzeżenie: (0%)
-----


napisałem skrypt który z xml generuje csv i działa to dla większości z ponad 20.000 węzłów, ale niektóre wygenerowane linie csv są zepsute i nie mam pojęcia z jakiego powodu. wrzuciłem na hosting plik (ma 48mb ale widać w kilku miejscach te błędy gdy wyłączy się word wrap - nagle następuje przełamanie linii, albo jakiś notice) wynik
Go to the top of the page
+Quote Post
Neutral
post 1.06.2018, 22:43:29
Post #2





Grupa: Zarejestrowani
Postów: 286
Pomógł: 46
Dołączył: 10.01.2016

Ostrzeżenie: (0%)
-----


Czy mógłbyś podać kod?
Go to the top of the page
+Quote Post
SmokAnalog
post 1.06.2018, 23:11:44
Post #3





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Zamiast podawać ogromny plik, który w dodatku być może zawiera wrażliwe dane, wysil się na wycięcie z niego jednej prawidłowej i jednej nieprawidłowej linii. I, jak kolega wyżej zasugerował, pokaż kod.
Go to the top of the page
+Quote Post
Pyton_000
post 2.06.2018, 06:36:28
Post #4





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Kod
<b>Notice</b>:  Trying to get property 'LastName' of non-object in <b>H:\xampp\htdocs\pubmed\csv.php</b> on line <b>71</b><br />
<br />
<b>Notice</b>:  Trying to get property 'ForeName' of non-object in <b>H:\xampp\htdocs\pubmed\csv.php</b> on line <b>73</b><br />


Jakieś notice...

Przełamania lini też są poprawne tylko Ty nie poprawnie generujesz CSV. Teksty powinny być ujęte w np. " wtedy przełamanie linni jest nie istotne.

KOD pokaż..
Go to the top of the page
+Quote Post
neurogen
post 2.06.2018, 11:06:04
Post #5





Grupa: Zarejestrowani
Postów: 58
Pomógł: 0
Dołączył: 25.03.2018

Ostrzeżenie: (0%)
-----


link do skryptu zamieniającego xml (312mb) na csv. ładuje się 1-2min.
http://evidence-based-dentistry.org/csv.php
view-source:http://evidence-based-dentistry.org/csv.php

np.linie 24,918,4284


csv.php
  1. <?php
  2. $articles = simplexml_load_file('2017.xml');
  3. $id=27;
  4. foreach ($articles as $text):
  5.  
  6.  
  7. $title=$text->MedlineCitation->Article->ArticleTitle;
  8.  
  9. $postname = strtolower($title);
  10. $postname = str_replace(' ', '-', $postname);
  11. $postname = preg_replace('/[^0-9a-z\-]+/', '', $postname);
  12. $postname = preg_replace('/[\-]+/', '-', $postname);
  13. $postname = trim($postname,'-');
  14. $postname = substr($postname,0,200).'';
  15.  
  16. $abstract=$text->MedlineCitation->Article->Abstract->AbstractText;
  17.  
  18.  
  19. $author=$text->MedlineCitation->Article->AuthorList->Author;
  20. $journallowercase=$text->MedlineCitation->Article->Journal->Title;
  21. $journal = ucwords($journallowercase);
  22.  
  23. $year=$text->MedlineCitation->DateRevised->Year;
  24. $month=$text->MedlineCitation->DateRevised->Month;
  25. $day=$text->MedlineCitation->DateRevised->Day;
  26.  
  27. $pmid=$text->PubmedData->ArticleIdList->ArticleId;
  28.  
  29. #$tag1=$text->MedlineCitation->KeywordList->Keyword[0];
  30. #$tag2=$text->MedlineCitation->KeywordList->Keyword[1];
  31. #$tag3=$text->MedlineCitation->KeywordList->Keyword[2];
  32. #$tag4=$text->MedlineCitation->KeywordList->Keyword[3];
  33. #$tag5=$text->MedlineCitation->KeywordList->Keyword[4];
  34.  
  35. #$tag6=$text->MeshHeadingList->MeshHeading->DescriptorName;
  36.  
  37.  
  38. if (! empty($abstract)) {
  39. echo $id;#id
  40. echo "@";
  41. echo "1";#post_author
  42. echo "@";
  43. echo $year;
  44. echo "-";
  45. echo $month;
  46. echo "-";
  47. echo $day;
  48. echo "@";#post_date
  49. echo $year;
  50. echo "-";
  51. echo $month;
  52. echo "-";
  53. echo $day;
  54. echo " 12:00:00";#post_date_gmt
  55. echo "@";
  56.  
  57. echo "<div style='text-align:justify;'>";
  58. echo "<strong>Abstract:</strong> ";
  59. echo $abstract;#post_content
  60. echo "<br/><br/>";
  61. echo $journal;
  62. echo " - ";
  63.  
  64. echo $text->MedlineCitation->Article->AuthorList->Author[0]->LastName;
  65. echo " ";
  66. echo $text->MedlineCitation->Article->AuthorList->Author[0]->ForeName;
  67. echo ", ";
  68.  
  69. if (!empty($text->MedlineCitation->Article->AuthorList->Author[1]->LastName)) {
  70. echo $text->MedlineCitation->Article->AuthorList->Author[1]->LastName;
  71. echo " ";
  72. echo $text->MedlineCitation->Article->AuthorList->Author[1]->ForeName;
  73. echo ", ";
  74. }
  75. if (!empty($text->MedlineCitation->Article->AuthorList->Author[2]->LastName)) {
  76. echo $text->MedlineCitation->Article->AuthorList->Author[2]->LastName;
  77. echo " ";
  78. echo $text->MedlineCitation->Article->AuthorList->Author[2]->ForeName;
  79. echo ", ";
  80. }
  81. if (!empty($text->MedlineCitation->Article->AuthorList->Author[3]->LastName)) {
  82. echo $text->MedlineCitation->Article->AuthorList->Author[3]->LastName;
  83. echo " ";
  84. echo $text->MedlineCitation->Article->AuthorList->Author[3]->ForeName;
  85. echo ", ";
  86. }
  87. if (!empty($text->MedlineCitation->Article->AuthorList->Author[4]->LastName)) {
  88. echo $text->MedlineCitation->Article->AuthorList->Author[4]->LastName;
  89. echo " ";
  90. echo $text->MedlineCitation->Article->AuthorList->Author[4]->ForeName;
  91. echo ", ";
  92. }
  93. if (!empty($text->MedlineCitation->Article->AuthorList->Author[5]->LastName)) {
  94. echo $text->MedlineCitation->Article->AuthorList->Author[5]->LastName;
  95. echo " ";
  96. echo $text->MedlineCitation->Article->AuthorList->Author[5]->ForeName;
  97. echo " ";
  98. }
  99.  
  100. echo " - ";
  101. echo $day;
  102. echo "/";
  103. echo $month;
  104. echo "/";
  105. echo $year;
  106. echo " - ";
  107. echo "<a href='https://www.ncbi.nlm.nih.gov/pubmed/$pmid' target='_blank'>";
  108. echo $pmid;
  109. echo "</a>";
  110. echo "</div>";
  111.  
  112. echo "@";
  113. echo $title;#post_title
  114. echo "@";
  115. echo $abstract;#post_excerpt
  116. echo "@";
  117. echo "publish";#post_status
  118. echo "@";
  119. echo "open";#comment_status
  120. echo "@";
  121. echo "open";#ping_status
  122. echo "@";
  123. echo "";#post_password
  124. echo "@";
  125. echo $postname;#post_name
  126. echo "@";
  127. echo "";#to_ping
  128. echo "@";
  129. echo "";#pinged
  130. echo "@";
  131. echo $year;
  132. echo "-";
  133. echo $month;
  134. echo "-";
  135. echo $day;#post_modified
  136. echo "@";
  137. echo $year;
  138. echo "-";
  139. echo $month;
  140. echo "-";
  141. echo $day;
  142. echo " 12:00:00";#post_modified_gmt
  143. echo "@";
  144. echo "";#post_content_filtered
  145. echo "@";
  146. echo "0";#post_parent
  147. echo "@";
  148. echo "http://localhost/ebd/?p=$id";#guid
  149. echo "@";
  150. echo "0";#menu_order
  151. echo "@";
  152. echo "post";#post_type
  153. echo "@";
  154. echo "";#post_mime_type
  155. echo "@";
  156. echo "0";#comment_count
  157.  
  158.  
  159. echo "\n";
  160. $id++;
  161.  
  162. }
  163. else
  164. {
  165. echo "";
  166. }
  167.  
  168. endforeach;
  169.  
  170. ?>
Go to the top of the page
+Quote Post
Neutral
post 2.06.2018, 11:26:10
Post #6





Grupa: Zarejestrowani
Postów: 286
Pomógł: 46
Dołączył: 10.01.2016

Ostrzeżenie: (0%)
-----


Podaj kod w formacie xml, a nie coś już wygenerowanego. OK, dobra już nic, nie zajrzałem do view-source.

Podaj tego jakiś wycinek, bo u mnie wywala błędy (warning).

Ten post edytował Neutral 2.06.2018, 11:34:43
Go to the top of the page
+Quote Post
SmokAnalog
post 2.06.2018, 11:29:28
Post #7





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


PHP ma wbudowane funkcje do obsługi CSV, skorzystaj z nich. W Twojej wersji wystarczy, że coś ma wewnątrz znak @ i już masz błąd. Poza tym masz HTML w CSV? Na 99% coś źle kombinujesz.
Go to the top of the page
+Quote Post
neurogen
post 2.06.2018, 20:21:50
Post #8





Grupa: Zarejestrowani
Postów: 58
Pomógł: 0
Dołączył: 25.03.2018

Ostrzeżenie: (0%)
-----


wstawiam html do csv i to działa (wordpress odczytuje to prawidłowo), choć pewnie można to zrobić inaczej i lepiej. w tekście nie ma znaków @ innych niż separatory kolumn bo są kasowane wcześniej przez php. pytanie mam tylko z czego wynikają te błędy. że brakuje ' lub " ?





bardzo proszę o pomoc w tym temacie.

Ten post edytował neurogen 2.06.2018, 18:32:38
Go to the top of the page
+Quote Post
SmokAnalog
post 3.06.2018, 12:36:32
Post #9





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Jeśli Author to normalna tablica, zamień sobie to:

  1. echo $text->MedlineCitation->Article->AuthorList->Author[0]->LastName;
  2. echo " ";
  3. echo $text->MedlineCitation->Article->AuthorList->Author[0]->ForeName;
  4. echo ", ";
  5.  
  6. if (!empty($text->MedlineCitation->Article->AuthorList->Author[1]->LastName)) {
  7. echo $text->MedlineCitation->Article->AuthorList->Author[1]->LastName;
  8. echo " ";
  9. echo $text->MedlineCitation->Article->AuthorList->Author[1]->ForeName;
  10. echo ", ";
  11. }
  12.  
  13. if (!empty($text->MedlineCitation->Article->AuthorList->Author[2]->LastName)) {
  14. echo $text->MedlineCitation->Article->AuthorList->Author[2]->LastName;
  15. echo " ";
  16. echo $text->MedlineCitation->Article->AuthorList->Author[2]->ForeName;
  17. echo ", ";
  18. }
  19.  
  20. if (!empty($text->MedlineCitation->Article->AuthorList->Author[3]->LastName)) {
  21. echo $text->MedlineCitation->Article->AuthorList->Author[3]->LastName;
  22. echo " ";
  23. echo $text->MedlineCitation->Article->AuthorList->Author[3]->ForeName;
  24. echo ", ";
  25. }
  26.  
  27. if (!empty($text->MedlineCitation->Article->AuthorList->Author[4]->LastName)) {
  28. echo $text->MedlineCitation->Article->AuthorList->Author[4]->LastName;
  29. echo " ";
  30. echo $text->MedlineCitation->Article->AuthorList->Author[4]->ForeName;
  31. echo ", ";
  32. }
  33.  
  34. if (!empty($text->MedlineCitation->Article->AuthorList->Author[5]->LastName)) {
  35. echo $text->MedlineCitation->Article->AuthorList->Author[5]->LastName;
  36. echo " ";
  37. echo $text->MedlineCitation->Article->AuthorList->Author[5]->ForeName;
  38. echo " ";
  39. }


Na to:

  1. echo implode(', ', array_map(function ($author) {
  2. return $author->LastName . ' ' . $author->ForeName;
  3. }, $text->MedlineCitation->Article->AuthorList->Author));
Go to the top of the page
+Quote Post
neurogen
post 3.06.2018, 17:15:53
Post #10





Grupa: Zarejestrowani
Postów: 58
Pomógł: 0
Dołączył: 25.03.2018

Ostrzeżenie: (0%)
-----


dzięki to pewnie skróci kod ale raczej nie zlikwiduje błędów.
Go to the top of the page
+Quote Post
SmokAnalog
post 3.06.2018, 17:43:36
Post #11





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Nie mów hop smile.gif może naprawić, bo Twój błąd to odwoływanie się do nieistniejącego obiektu.
Go to the top of the page
+Quote Post
neurogen
post 3.06.2018, 18:54:03
Post #12





Grupa: Zarejestrowani
Postów: 58
Pomógł: 0
Dołączył: 25.03.2018

Ostrzeżenie: (0%)
-----


<b>Warning</b>: array_map(): Argument #2 should be an array in <b>H:\xampp\htdocs\pubmed\csv.php</b> on line <b>106</b><br />
<br />
<b>Warning</b>: implode(): Invalid arguments passed in <b>H:\xampp\htdocs\pubmed\csv.php</b> on line <b>106</b><br />
Go to the top of the page
+Quote Post
SmokAnalog
post 3.06.2018, 19:00:30
Post #13





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Czyli to nie jest tablica, ale obiekt implementujący ArrayAccess. Ja bym poszedł w tym kierunku, żeby pozamieniać ten kod z wypisywaniem autorów na coś zgrabniejszego i bezpieczniejszego. Mogę Ci pomóc z ogarnięciem tego, jeśli mi powiesz gdzie mogę znaleźć tę bibliotekę.
Go to the top of the page
+Quote Post
neurogen
post 3.06.2018, 19:07:08
Post #14





Grupa: Zarejestrowani
Postów: 58
Pomógł: 0
Dołączył: 25.03.2018

Ostrzeżenie: (0%)
-----


źródło xml jest tu xml a kod skryptu php tu php
Go to the top of the page
+Quote Post
SmokAnalog
post 3.06.2018, 19:12:22
Post #15





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Link do PHP nie działa.
Go to the top of the page
+Quote Post
neurogen
post 3.06.2018, 19:25:51
Post #16





Grupa: Zarejestrowani
Postów: 58
Pomógł: 0
Dołączył: 25.03.2018

Ostrzeżenie: (0%)
-----


poprawka: txt
Go to the top of the page
+Quote Post
SmokAnalog
post 3.06.2018, 19:55:58
Post #17





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Spróbuj tego:

  1. echo implode(', ', array_map(function (SimpleXMLElement $author) {
  2. return $author->LastName . ' ' . $author->ForeName;
  3. }, ((array) $text->MedlineCitation->Article->AuthorList)['Author']));


Nie wiem jak zgrabniej zamienić SimpleXMLElement na tablicę dzieci, ta bilbioteka jest strasznie wkur*iająca.
Go to the top of the page
+Quote Post
neurogen
post 4.06.2018, 06:31:43
Post #18





Grupa: Zarejestrowani
Postów: 58
Pomógł: 0
Dołączył: 25.03.2018

Ostrzeżenie: (0%)
-----


niestety te same błędy
Go to the top of the page
+Quote Post
SmokAnalog
post 4.06.2018, 08:00:39
Post #19





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


U mnie błędów nie ma, ale prawdopodobnie korzystasz z innego pliku XML niż ja. W kodzie jest użyty 2017.xml, a wysłałeś mi 2018.xml.
Go to the top of the page
+Quote Post
neurogen
post 4.06.2018, 10:04:07
Post #20





Grupa: Zarejestrowani
Postów: 58
Pomógł: 0
Dołączył: 25.03.2018

Ostrzeżenie: (0%)
-----


faktycznie nie zauważam błędów NOTICE ale te przełamania kodu nadal występują i nie wiem dlaczego. widać to w podglądzie strony np linia 24 view-source:http://evidence-based-dentistry.org/csv.php
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 18.04.2024 - 09:15