PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Указать на ошибки


Указать на ошибки

Сообщений 1 страница 13 из 13

1

Перевел код из JS в PureBasic  а он нормально не работает

Код на JS
Код:
function CSV(str)
{
    this.Data = [];
    this.Data.push([]);

    let entry = "";
    let row = 0;
    let lock = false;

    For (let i = 0; i < str.length+1; i++)
    {
        let char = str[i];
        //console.log(`${i}:${char} ${str.charCodeAt(i)}`);

        If(char === undefined)
        {
            this.Data.pop();
            Break;
        }

        If(lock && char === '"' && (str[i+1] === "," || str[i+1] === "\n") )
        {
            lock = false;
            Continue
        }
        Else If(!lock && entry === "" && char === '"' && (str[i+1] !== ","  || str[i+1] !== "\n") )
        {
            lock = true;
            Continue
        }

        If(!lock && (char === "," || char === '"' && str[i+1] === "," || char === "\n") )
        {
            this.Data[row].push(entry);
            console.log(`${row}:${entry}`);
            entry = "";

            If(char === "\n")
            {
                this.Data.push([]);
                row++;
            }
        }
        Else
        {
            If(char === '"' && str[i+1] === '"') i++;
            entry += char;
        }
    }

    console.log("-----------------------");
    console.log(this.Data.length);
    console.log(this.Data);
}

let Data = 
`"abc","def","ghi"
"012","345","678"
abc,def,ghi
012,345,678
"abc"
012
`;

let csv3 = new CSV(Data);
console.log(csv3);
Пример того что должно получится на JS

0:abc
0:def
0:ghi
1:012
1:345
1:678
2:abc
2:def
2:ghi
3:012
3:345
3:678
4:abc
5:012

Сам код PureBasic:
Код:
Procedure iCSV(Array iStr.a(1))  
  entry.s = ""
  row.l = 0
  lock.b = #False
  
  For i = 0 To ArraySize(iStr())    
    char.a = iStr(i)
    
    If char = 0 : Break : EndIf
    
    If (lock And char = 34 And (iStr(i+1) = 44 Or iStr(i+1) = 10))      
      lock = #False
      Continue
    ElseIf (Not lock And entry = "" And char = 34 And (iStr(i+1) <> 44 Or iStr(i+1) <> 10))
      lock = #True
      Continue
    EndIf 
    
    If (Not lock And (char = 44 Or char = 34 And iStr(i+1) = 44 Or char = 10))
      ;this.Data[row].push(entry);   
      Debug Str(row)+" | "+entry
      Debug "----------------"
      CallDebugger
      entry = ""
      
      If (char = 10)
        ; this.Data.push([]);
        CallDebugger
        row + 1        
      EndIf
    Else
      If (char = 34 And iStr(i+1) = 34)
        i+1
      EndIf
      entry + Chr(char)      
    EndIf
  Next
EndProcedure

wer.s = Chr(34)+"abc"+Chr(34)+","+Chr(34)+"def"+Chr(34)+","+Chr(34)+"ghi"+Chr(34)+Chr(10)+Chr(34)+"012"+Chr(34)+","+Chr(34)+"345"+Chr(34)+","+Chr(34)+"678"+Chr(34)+Chr(10)+"abc,def,ghi"+Chr(10)+"012,345,678"+Chr(10)+Chr(34)+"abc"+Chr(34)+Chr(10)+"012"+Chr(10)

*idM = Ascii(wer) 
Len.l = MemorySize(*idM) 
Dim iStr.a(Len-1)   
CopyMemory(*idM, @iStr() , Len)

iCSV(iStr()) 

FreeMemory(*idM) 
FreeArray(iStr())

0

2

может вот так

Код:
iStr(i+1) <> 44 And iStr(i+1) <> 10

0

3

PSY написал(а):

может вот так

Куда его ставить?
На какой кусок менять?

0

4

Код:
Procedure iCSV(Array iStr.a(1))  
  entry.s = ""
  row.l = 0
  lock.b = #False
  
  For i = 0 To ArraySize(iStr())    
    char.a = iStr(i)
    
    If char = 0 : Break : EndIf
    
    If (lock And char = 34 And (iStr(i+1) = 44 Or iStr(i+1) = 10))      
      lock = #False
      Continue
    ElseIf (Not lock And entry = "" And char = 34 And (iStr(i+1) <> 44 And iStr(i+1) <> 10))
      lock = #True
      Continue
    EndIf 
    
    If (Not lock And (char = 44 Or char = 34 And iStr(i+1) = 44 Or char = 10))
      ;this.Data[row].push(entry);   
      Debug Str(row)+" | "+entry
      Debug "----------------"
      CallDebugger
      entry = ""
      
      If (char = 10)
        ; this.Data.push([]);
        CallDebugger
        row + 1        
      EndIf
    Else
      If (char = 34 And iStr(i+1) = 34)
        i+1
      EndIf
      entry + Chr(char)      
    EndIf
  Next
EndProcedure

wer.s = Chr(34)+"abc"+Chr(34)+","+Chr(34)+"def"+Chr(34)+","+Chr(34)+"ghi"+Chr(34)+Chr(10)+Chr(34)+"012"+Chr(34)+","+Chr(34)+"345"+Chr(34)+","+Chr(34)+"678"+Chr(34)+Chr(10)+"abc,def,ghi"+Chr(10)+"012,345,678"+Chr(10)+Chr(34)+"abc"+Chr(34)+Chr(10)+"012"+Chr(10)

*idM = Ascii(wer) 
Len.l = MemorySize(*idM) 
Dim iStr.a(Len-1)   
CopyMemory(*idM, @iStr() , Len)

iCSV(iStr()) 

FreeMemory(*idM) 
FreeArray(iStr())

0

5

Зачем менять OR на AND?
Если в оригинале стоит Logical OR (||)?
И это изменение не работает.

0

6

варик от AI ;)

Код:
Structure CSV
  List Data.s()
EndStructure

Procedure CSV_Parse(*csv.CSV, str.s)
  Protected entry.s = ""
  Protected row = 0
  Protected lock = #False
  Protected i, char.s

  AddElement(*csv\Data())
  *csv\Data() = ""

  For i = 1 To Len(str) + 1
    char = Mid(str, i, 1)

    If i > Len(str)
      DeleteElement(*csv\Data())
      Break
    EndIf

    If lock And char = #DQUOTE$ And (Mid(str, i + 1, 1) = "," Or Mid(str, i + 1, 1) = #LF$)
      lock = #False
      Continue
    ElseIf Not lock And entry = "" And char = #DQUOTE$ And (Mid(str, i + 1, 1) <> "," Or Mid(str, i + 1, 1) <> #LF$)
      lock = #True
      Continue
    EndIf

    If Not lock And (char = "," Or (char = #DQUOTE$ And Mid(str, i + 1, 1) = ",") Or char = #LF$)
      AddElement(*csv\Data())
      *csv\Data() = entry
      Debug Str(row) + ":" + entry
      entry = ""

      If char = #LF$
        AddElement(*csv\Data())
        *csv\Data() = ""
        row + 1
      EndIf
    Else
      If char = #DQUOTE$ And Mid(str, i + 1, 1) = #DQUOTE$
        i + 1
      EndIf
      entry + char
    EndIf
  Next

  Debug "-----------------------"
  Debug ListSize(*csv\Data())
  ForEach *csv\Data()
    Debug *csv\Data()
  Next
EndProcedure

Define Datas.s
Datas = ~"\"abc\",\"def\",\"ghi\"\n\"012\",\"345\",\"678\"\nabc,def,ghi\n012,345,678\n\"abc\"\n012\n"

Define csv.CSV
CSV_Parse(@csv, Datas)

0

7

Нужно было спросить у ИИ зачем список помещен в структуру.

0

8

Пётр
...ну тут тоже приколы..

Код:
; Глобальные переменные для хранения CSV данных
Global Dim CSVData.s(0, 0) ; Двумерный массив для хранения данных
Global CSVRowCount = 0      ; Количество строк
Global CSVColCount = 0      ; Количество столбцов

Procedure ResizeCSVArray(newRowCount, newColCount)
  ; Освобождаем текущий массив
  FreeArray(CSVData())

  ; Создаем новый массив с новыми размерами
  Dim CSVData.s(newRowCount, newColCount)
EndProcedure

Procedure CSV_Parse(str.s)
  Protected entry.s = ""    ; Текущее значение ячейки
  Protected rowIndex = 0    ; Индекс текущей строки
  Protected colIndex = 0    ; Индекс текущего столбца
  Protected lock = #False   ; Флаг для обработки кавычек
  Protected i, char.s

  ; Инициализация массива
  ResizeCSVArray(0, 0)
  CSVRowCount = 0
  CSVColCount = 0

  For i = 1 To Len(str)
    char = Mid(str, i, 1)

    ; Обработка кавычек
    If char = #DQUOTE$
      If lock And Mid(str, i + 1, 1) = #DQUOTE$
        ; Двойная кавычка внутри поля
        entry + #DQUOTE$
        i + 1
      Else
        ; Переключение режима кавычек
        lock = ~lock
      EndIf
      Continue
    EndIf

    ; Обработка разделителей (запятая или новая строка)
    If Not lock And (char = "," Or char = #LF$)
      ; Сохраняем текущую запись
      If CSVColCount <= colIndex
        CSVColCount = colIndex + 1
        ResizeCSVArray(CSVRowCount, CSVColCount)
      EndIf
      CSVData(rowIndex, colIndex) = entry
      Debug "Row " + Str(rowIndex) + ", Col " + Str(colIndex) + ": " + entry
      entry = ""
      colIndex + 1

      ; Если это новая строка, переходим на следующую строку
      If char = #LF$
        rowIndex + 1
        colIndex = 0
        CSVRowCount = rowIndex + 1
        ResizeCSVArray(CSVRowCount, CSVColCount)
      EndIf
    Else
      ; Добавляем символ к текущей записи
      entry + char
    EndIf
  Next

  ; Добавляем последнюю запись, если она есть
  If entry <> ""
    If CSVColCount <= colIndex
      CSVColCount = colIndex + 1
      ResizeCSVArray(CSVRowCount, CSVColCount)
    EndIf
    CSVData(rowIndex, colIndex) = entry
    Debug "Row " + Str(rowIndex) + ", Col " + Str(colIndex) + ": " + entry
  EndIf

  ; Вывод итоговой информации
  Debug "-----------------------"
  Debug "Total Rows: " + Str(CSVRowCount)
  Debug "Total Columns: " + Str(CSVColCount)
EndProcedure

; Пример данных CSV
Define csvData.s
csvData = ~"\"abc\",\"def\",\"ghi\"\n\"012\",\"345\",\"678\"\nabc,def,ghi\n012,345,678\n\"abc\"\n012\n"

; Парсинг CSV
CSV_Parse(csvData)

0

9

Код PureBasic
Код:
Procedure iCSV(Array iStr.a(1))  
  entry.s = ""
  row.l = 0
  lock.b = #False
  
  For i = 0 To ArraySize(iStr())    
    char.l = iStr(i)
    If char = 0 : Break : EndIf
        
    If Bool(lock & Bool(char = '"') & Bool(Bool(iStr(i+1) = ',') | Bool(iStr(i+1) = 10))) : lock = #False : Continue
    ElseIf Bool(~lock & Bool(entry = "") & Bool(char = '"') & Bool(Bool(iStr(i+1) <> ',') | Bool(iStr(i+1) <> 10))) : lock = #True : Continue
    EndIf 
    
    ;If Bool(~lock & Bool(Bool(char = ',') | Bool(char = '"') & Bool(iStr(i+1) = ',') | Bool(char = 10))) ;Проблема 
    If Bool(~lock & Bool(Bool(char = ',') Or Bool(char = '"') & Bool(iStr(i+1) = ',') | Bool(char = 10))) ;Проблема 
      ;this.Data[row].push(entry);   
      Debug Str(row)+" | "+entry
      Debug "----------------"
      ;      CallDebugger
      entry = ""
      
      If Bool(char = 10) : row + 1  : EndIf
      ; this.Data.push([]);        ;CallDebugger
    Else
      If Bool(Bool(char = '"') & Bool(iStr(i+1) =  '"')) : i+1 : EndIf
      entry + Chr(char)      
    EndIf
  Next
EndProcedure

wer.s = Chr(34)+"abc"+Chr(34)+","+Chr(34)+"def"+Chr(34)+","+Chr(34)+"ghi"+Chr(34)+Chr(10)+Chr(34)+"012"+Chr(34)+","+Chr(34)+"345"+Chr(34)+","+Chr(34)+"678"+Chr(34)+Chr(10)+"abc,def,ghi"+Chr(10)+"012,345,678"+Chr(10)+Chr(34)+"abc"+Chr(34)+Chr(10)+"012"+Chr(10)

*idM = Ascii(wer) : Len.l = MemorySize(*idM) : Dim iStr.a(Len-1) : CopyMemory(*idM, @iStr() , Len)

iCSV(iStr()) 

FreeMemory(*idM)  : FreeArray(iStr())

Почему первый вариант работает, а второй нет?

Первый: If Bool(~lock & Bool(Bool(char = ',') Or Bool(char = '"') & Bool(iStr(i+1) = ',') | Bool(char = 10)))
Второй:  If Bool(~lock & Bool(Bool(char = ',') |   Bool(char = '"') & Bool(iStr(i+1) = ',') | Bool(char = 10)))

Оригинал:   if(!lock && (char === "," || char === '"' && str[i+1] === "," || char === "\n") )

0

10

@ZOLO@

Код:
  Priority Level |     Operators
  ---------------+---------------------------
       8 (high)  |         ~, - (negative)
       7         |      <<, >>, %, !
       6         |         |, &
       5         |         *, /
       4         |         +, - (substraction)
       3         | >, >=, =>, <, <=, =<, =, <>
       2         |          Not
       1 (low)   |      And, Or, XOr

0

11

@ZOLO@ написал(а):

Оригинал

В нем логические операторы, аналоги Not, And, Or, а не побитовые операторы.
Попробуйте

Код:
If Not lock And (iStr(i+1) = ',' And (char = ',' Or char = '"' Or char = 10))

Или так

Код:
If Not (lock And (iStr(i+1) = ',' And (char = ',' Or char = '"' Or char = 10)))

0

12

а почему, этот  If (Not lock And (char = 44 Or char = 34 And iStr(i+1) = 44 Or char = 10)) не хочет работать нормально, и-за  приоритетов уровня?
ПЕТР НЕ работают примеры.

Отредактировано @ZOLO@ (18.02.2025 02:42:34)

0

13

@ZOLO@

Код:
If Bool(~lock & Bool(Bool(char = ',') | (Bool(char = '"') & Bool(iStr(i+1) = ',')) | Bool(char = 10))) 
Код:
If Bool(Not lock And Bool(Bool(char = ',') Or (Bool(char = '"') And Bool(iStr(i+1) = ',')) Or Bool(char = 10))) 

Отредактировано Lin (18.02.2025 12:38:47)

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Указать на ошибки