8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

Golang bufio.Scanner:令牌太长

Satyajay Prabhakar 2月前

222 0

我有一个大文件(对于内存来说太大了),我需要用分隔符 \'|\' 解析每个记录。问题是,每个记录的大小都不同,这就是为什么我总是收到错误 \'但是...

我有一个大文件(对于内存来说太大了),我需要用分隔符“|”解析每个记录。问题是,每个记录的大小都不同,这就是为什么我总是收到错误“bufio.Scanner:token 太长”。

如果我遇到 bufio.Scanner:token too long 错误,是否有任何方法可以用更大的缓冲区大小重试扫描?或者 bufio.Scanner 对我来说不是正确的选择,因为我不知道每个记录的确切大小?

谢谢

https://go.dev/play/p/Erx15nXXCGk

package main

import (
    "bufio"
    "bytes"
    "fmt"
    "strings"
)

func main() {
    // Example byte array
    byteArray := []byte("data1|data2|data3|data4|data5|data6|data7|data8|data9|data10")

    // Buffer size for reading chunks
    bufferSize := 6
    buf := make([]byte, bufferSize)

    // Create a bufio.Scanner with a custom split function
    scanner := bufio.NewScanner(bytes.NewReader(byteArray))
    scanner.Buffer(buf, bufferSize)
    scanner.Split(splitFunc)

    // Read the byte array in chunks
    for scanner.Scan() {
        // Process each token (chunk)
        chunk := scanner.Text()
        fmt.Println("Chunk:", chunk, "Chunk Length:", len(chunk))
    }
    if err := scanner.Err(); err != nil {
        if err == bufio.ErrTooLong {
            fmt.Println("Error:", err)
            fmt.Printf("Buffer size %d is too small...\n", bufferSize)
        } else {
            fmt.Println("Error:", err)
        }
    }
}

func splitFunc(data []byte, atEOF bool) (advance int, token []byte, err error) {

    // Return nothing if at end of file and no data passed
    if atEOF && len(data) == 0 {
        return 0, nil, nil
    }

    if i := strings.Index(string(data), "|"); i >= 0 {
        return i + 1, data[0:i], nil
    }

    // If at end of file with data return the data
    if atEOF {
        return len(data), data, nil
    }

    return
}
帖子版权声明 1、本帖标题:Golang bufio.Scanner:令牌太长
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Satyajay Prabhakar在本站《file》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 看起来,当前鼠标事件(\'drop event\')导致菜单直接消失。您只需要在 \'invokeLater\' 方法中显示菜单即可。

    import static java.awt.dnd.DnDConstants.ACTION_COPY;
    
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Container;
    import java.awt.Dimension;
    import java.awt.Point;
    import java.awt.datatransfer.DataFlavor;
    import java.awt.dnd.DropTarget;
    import java.awt.dnd.DropTargetAdapter;
    import java.awt.dnd.DropTargetDropEvent;
    
    import javax.swing.JFrame;
    import javax.swing.JMenuItem;
    import javax.swing.JPanel;
    import javax.swing.JPopupMenu;
    import javax.swing.SwingUtilities;
    
    public class DNDTest {
    
        DNDTest() {
            JFrame f = new JFrame("Test dnd");
            Container c = f.getContentPane();
            final JPanel jp = new JPanel(new BorderLayout());
            jp.setBackground(Color.RED);
            jp.setToolTipText("Drop a string here");
            jp.setPreferredSize(new Dimension(200, 200));
            c.add(jp);
    
            DropTarget dt = new DropTarget(jp, ACTION_COPY, new DropTargetAdapter() {
                @Override
                public void drop(DropTargetDropEvent dtde) {
                    if (dtde.isDataFlavorSupported(DataFlavor.stringFlavor)) {
                        try {
                            dtde.acceptDrop(ACTION_COPY);
                            String trns = (String) dtde.getTransferable().getTransferData(DataFlavor.stringFlavor);
                            System.err.println("Dropped string " + trns);
                            Point loc = dtde.getLocation();
    
                            // Show a popup after the drop operation
                            JPopupMenu jpm2 = new JPopupMenu();
                            JMenuItem jmi2 = new JMenuItem("Popup option 1");
                            jpm2.add(jmi2);
                            System.err.println("About to show popup after drop at " + loc.getX() + "," + loc.getY());
                            SwingUtilities.invokeLater(() -> jpm2.show(jp, (int) loc.getX(), (int) loc.getY()));
                        } catch (Exception ex) {
                            ex.printStackTrace();
                        }
                        return;
                    }
                    dtde.rejectDrop();
                }
            }, true);
    
            f.pack();
            f.setVisible(true);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(DNDTest::new);
        }
    }
    
返回
作者最近主题: